Es gibt viele Methoden, die die Codeausführung verbessern. Leider ist der Geschwindigkeitsgewinn
oft nur gering. Sie sollten bedenken, dass manche Optimierungen an anderer Stelle zu
Verschlechterungen führen können. Optimierung sollte ein integraler Bestandteil ihrer Anwendung
sein. Das Leistungsverhalten der Anwendung soll in diesen Bereichen optimiert werden:
Es gibt mehrere Bereiche die optimiert werden können. Allgemein wären das diese:
 |
1. Nie den "Variant"-Datentyp verwenden |
| |
Variablen, die vom Typ Variant sind, verbrauchen mehr Speicher und werden
langsamer bearbeitet als andere. Versuchen Sie deshalb möglichst immer, Ihren
Variablen ein entsprechendes Format wie Byte,
Integer, Long,
Single oder Double für Zahlen und
String für Zeichenfolgen zuzuweisen. In den meisten Fällen
kommt VB auch damit klar, wenn Sie Zahlen in String-Variablen speichern und damit
rechnen.
Achtung: Wenn Sie Variablen nicht explizit als einen bestimmten Typ deklarieren,
weist Ihnen VB automatisch den Datentyp Variant zu!
|
| |
 |
2. Integer-Division |
| |
Oft ist eine Division mit Nachkommastellen (Operator /) nicht
notwendig. Hier sollte die Integer-Division (Rechenoperator \)
verwendet werden.
|
| |
 |
3. Logische Verknüpfung (1) |
| |
Bei einer Kombination von Integer-Werten mit logischen verwenden viele diese
Lösung:
If X = 23 Then
Y = True
Else
Y = False
End If
|
Besser wäre jedoch dies:
(X = 5) wird als bool'scher Ausdruck behandelt. Ist
X gleich 5 ist der Wert
True, sonst ist er
False.
|
| |
 |
4. Logische Verknüpfung (2) |
| |
Wenn eine bool'sche Variable von einer anderen abhängt, wird oft folgendes
verwendet:
If X = True Then
Y = False
Else
Y = True
End If
|
Besser wäre hier:
|
| |
 |
5. Logische Verknüpfungen (3) |
| |
Der implizite Vergleich ist um einiges schneller als der explizite. Beispiel:
If X = True Then 'explizit
If X Then 'implizit
|
|
| |
 |
6. Leere Strings erkennen |
| |
Wenn ein String keine Zeichen beinhaltet, ist seine Länge gleich 0. Man kann dies so
feststellen:
If TestString = "" Then '...
|
Messbar schneller ist jedoch:
If Len(TestString) = 0 Then '...
|
|
| |
 |
7. Alphanumerische Zeichen |
| |
Die schnellste Methode, um festzustellen, ob ein Zeichen alphanumerisch ist, bietet
die API-Funktion "IsCharAlphaNumericA".
|
| |
 |
8. IIf-Funktion |
| |
Die If-Then-Else-Struktur
ist um einiges schneller als die kürzere IIf-Funktion. Auch
ist diese Funktion relativ fehleranfällig.
|
| |
 |
9. String-Concatenation |
| |
Strings mit dem &-Operator zu verbinden ist ein sehr langsames
Verfahren. Besser ist es den String komplett anzugeben, soweit keine Variablen oder
Funktionen eingebunden werden müssen.
|
| |
 |
10. ANSI-Vergleich |
| |
Um ein Zeichen mit einem ANSI-Wert zu vergleichen, stellt Visual Basic zwei
Funktionen zur Verfügung:
ist langsamer als:
|
| |
 |
11. Interne Visual Basic-Konstanten verwenden |
| |
Beispiel: Um nachzuprüfen, ob ein String ein Leer-String ist, sollte man die
Visual Basic-Konstante "vbNullString" verwenden.
Es gibt mehrere solcher Konstanten. Nachzuschlagen sind diese im Objektkatalog
(F2).
|
| |
 |
12. Select-Case-Struktur |
| |
Man sollte bei der Verwendung der
Select-Case-Struktur darauf achten,
dass die wahrscheinlichsten Fälle an oberster Stelle stehen. So wird der Code um
einiges schneller.
|
| |
 |
13. Tabellen erzeugen |
| |
Muss man z.B. mit vielen Sinus-Werten arbeiten, empfiehlt es sich einen Array
anzulegen, der am Beginn des Programms mit den ganzen Werten belegt wird. Dieser
Array bleibt während der gesamten Laufzeit im Speicher und es kann dann schnell auf
die benötigten Werte zugegriffen werden.
|
| |
 |
14. 3rd-Party-Tools |
| |
Es gibt mehrere Tools, die Geschwindigkeitsverluste anzeigen können. Dies wäre eine
gute Hilfe, um zu sehen was optimiert werden muss. Leider sind die meisten dieser
Programme nicht ganz kostenfrei erhältlich, man kann sie jedoch oft in reduzierten
und beschränkten Shareware-Versionen gratis testen.
|
| |
 |
15. Grafiken |
| |
Nicht-komprimierte Grafiken (*.bmp) werden um einiges schneller angezeigt als z.B.
JPEG-, oder GIF-Grafiken. Jedoch benötigen diese mehr Speicherplatz. Eine mögliche
Methode wäre, die Grafik in einem komprimierten Format zu speichern und in eine
unsichtbare PictureBox zu laden. Überall wo die Grafik gebraucht wird, wird sie
von der PictureBox "hingeblittet". Die Grafiken werden intern zu Bitmap-Dateien
konvertiert und werden somit schneller angezeigt.
|
| |
 |
16. Formulare zu Beginn laden |
| |
Wenn beim Programmstart alle Formulare geladen werden, werden sie später direkt
angezeigt. Jedoch frisst das Programm dann schon bei Beginn sehr viel Speicher.
|
| |
 |
17. Keine Collections |
| |
Man sollte anstatt Collections immer Arrays verwenden, da diese um einiges schneller
bearbeitet werden. Collections sollten nur verwendet werden, wenn die speziellen
Befehle der Collections benötigt werden.
|
| |
 |
18. MemCopy oder RtlMoveMemory |
| |
Diese API-Funktionen sollten verwendet werden, wenn ein kompletter Array kopiert
werden soll.
|
| |
 |
19. Object |
| |
Die Verwendung des Object-Datentyps ist schlecht. Man sollte, wenn möglich,
sofort das richtige Objekt wählen, z.B. "CommandButton"
oder "PictureBox".
|
| |
 |
20. Objekte löschen |
| |
Wollen Sie Objekte löschen ist der schnellste Weg folgender:
|
| |
 |
21. Objekte deklarieren |
| |
Es gibt zwei Methoden, um Objekte zu deklarieren:
oder:
Dim Test As <Objekt>
Set Test = New <Objekt>
|
Die zweite Methode ist um einiges schneller als die erste.
|
| |
 |
22. ByRef vs. ByVal |
| |
Wenn möglich sollten Argumente immer
ByRef (By Reference)
übergeben werden. Der Vorteil zu
ByVal (By Value) sagt
schon der Name. Wenn ByRef
verwendet wird, wird nur die Adresse weitergegeben.
ByVal kopiert hingegen den Wert.
|
| |
 |
23. Fortschrittsleisten verwenden |
| |
Sollte einmal z.B. eine längere Berechnung anstehen, wäre die Einrichtung einer
ProgressBar zu empfehlen. Dadurch verändert sich die reale Geschwindigkeit nicht,
ganz im Gegenteil, durch den nötigen Einbau einer
DoEvents-Anweisung wird der Prozess oft noch verlangsamt,
die wahrgenommene Geschwindigkeit jedoch verändert sich umso mehr.
|
| |
 |
24. Befehle mit $ |
| |
Diese Befehle dienen der Stringverarbeitung. Es gibt dieselben auch ohne dieses
Zeichen. Jedoch sollten diese nicht verwendet werden, da hier mit Variant-Variablen
gearbeitet wird. Zu diesen Befehlen zählen z.B. Mid$(),
Left$(), Right$,
Trim$() und Chr$().
|
| |
 |
25. Show-Befehl |
| |
Beim Start wird normalerweise zuerst die Form_Load-Prozedur
gestartet. Danach wird die Form angezeigt. Durch den
Me.Show-Befehl am Beginn dieser Prozedur wird die Form früher
angezeigt und die wahrgenommene Geschwindigkeit steigt.
|
| |
 |
26. Splash-Screen |
| |
Sollte die Form_Load-Prozedur lange andauern ist ein
Splash-Screen zu empfehlen. Das ist eine Form, die für kurze Zeit angezeigt wird.
Hier können verschiedene Angaben wie z.B. Herstellername usw. angegeben werden.
Dadurch verringert sich die wahrgenommene Geschwindigkeit erheblich.
|
| |
 |
27. Formen vollständig entladen |
| |
Beim Schreiben eines Programmes sollte man darauf achten, nicht zuviel
Arbeitsspeicher zu verwenden. Ist alles aufgebraucht, wird das Übrige von Windows
auf die Festplatte geschrieben, was den Programmablauf sehr behindert.
Wichtig ist z.B., Formen nach Ihrer Verwendung nicht nur mit dem
Unload-Befehl zu entladen, sondern vollständig aus dem
Speicher zu löschen:
|
| |
 |
28. Move-Prozedur |
| |
Anstatt die Left- und Top-Eigenschaft
zu ändern, sollte man die Move-Methode benutzen.
|
| |
 |
29. Control-Eigenschaften speichern |
| |
Muss man z.B. oft auf die ScaleHeight-Eigenschaft zugreifen,
ist es sinnvoll, den Wert vorher in einer Variablen zu speichern. Danach kann man um
einiges schneller arbeiten.
|
| |
 |
30. Line-Prozedur (1) |
| |
Verwenden sie den zusätzlichen B-Parameter in Zusammenspiel
mit dem Line-Befehl, um ein Rechteck zu zeichnen.
Vier Linien zu zeichnen, ist zu langsam.
|
| |
 |
31. Line-Prozedur (2) |
| |
Verwenden Sie anstatt PSet die
Line-Methode, um einzelne Punkte zu zeichnen. Sie wird
um einiges schneller ausgeführt.
|
| |
 |
32. Grafik |
| |
Müssen Sie viele Grafikoperationen hintereinander durchführen, empfiehlt es sich
die passenden API-Funktionen zu verwenden, wie z.B. die
SetPixel- oder Ellipse-API.
|
| |
 |
33. Keine PictureBox |
| |
Sie sollten das Image-Steuerelement verwenden, wenn Sie die speziellen
Eigenschaften einer PictureBox nicht benötigen. Dieses verbraucht weniger
Arbeitsspeicher.
|
| |
 |
34. Steuerelemente-Arrays |
| |
Brauchen Sie mehrere gleiche Steuerelemente, verwenden Sie am besten ein
Steuerelemente-Array. Dieses verbraucht nicht so viel Arbeitsspeicher.
|
| |
 |
35. Lange Berechnungen (1) |
| |
Um lange Berechnungen durchzuführen, empfiehlt es sich ein Timer-Steuerelement
zu verwenden. Die Berechnung wird so im Hintergrund durchgeführt und der Benutzer
kann weiteren Aufgaben nachgehen.
|
| |
 |
36. Lange Berechnungen (2) |
| |
Sollte ein Benutzer nicht warten wollen, wäre es zu empfehlen die
DoEvents-Methode einzubauen. So kann der Benutzer die
Berechnung abbrechen und das Programm wird weitaus benutzerfreundlicher.
|
| |
 |
37. * statt ^ |
| |
Sollten Sie eine Zahl potenzieren wollen, geht dies mit dem Multiplikationsoperator
schneller. Zu empfehlen ist die Verwendung dieses Operators jedoch nur bei relativ
niedrigen Potenzierungen wie hoch² oder hoch³.
|
| |
 |
38. Zwischenergebnisse verwenden |
| |
Wenn Sie eine grosse Berechnung durchführen, sollten Sie nicht die gesamte
Rechnung in eine Zeile schreiben. Schön in kleinere Teile aufgeteilt wird schneller
gerechnet und ist dazu noch wesentlich übersichtlicher.
|
| |
 |
39. Schleifen |
| |
Wenn die Anzahl der Durchführungen einer Schleife von einer Funktion abhängt, ist es
besser den Wert zuerst in einer Variablen zu speichern als ihn pro Durchlauf neu zu
berechnen. Prominente Beispiele sind
LBound(<Array>) und
UBound(<Array>).
|
| |
 |
40. InStr-Funktion |
| |
Um ein Zeichen in einem String zu finden, sollten sie die seit Vb5 eingeführte
InStr-Funktion verwenden. Die schlechtere Variante wäre eine
Schleife durchlaufen zu lassen und jedes Zeichen mit dem gesuchten zu vergleichen.
|
| |
 |
41. ClipControls-Eigenschaft |
| |
Diese sollte auf False gestellt
sein. Diese Eigenschaft bestimmt, ob der Bereich unter den Steuerelementen
aktualisiert wird. Meistens gibt es keinen Grund dazu.
|
| |
 |
42. Steuerelemente verbergen |
| |
Beim Ändern der Eigenschaften eines stark grafisch ausgerichteten Steuerelements
sollte es zuvor ausgeblendet werden, damit es nicht bei jeder neuen Änderung
neu gezeichnet wird.
|
| |
 |
43. Code-Module nach Gruppen bilden |
| |
Visual Basic lädt Module nach Bedarf. Sind mehrere Prozeduren in verschiedenen
Modulen, werden all diese geladen. Im Form_Load-Ereignis
sollte nicht auf eine Prozedur in einem Modul zugegriffen werden, da sich dadurch die
Anzeigegeschwindigkeit verringert, es sei denn, die Form wurde zuvor mit
"Me.Show" eingeblendet.
|
| |
 |
44. Inline-Code verwenden |
| |
Man sollte nicht oft benötigten, kurzen Code direkt in den "Hauptcode" schreiben und
nicht in eigene Prozeduren packen. Die Ausführung verschnellert sich dadurch ein
bißchen.
|
| |
 |
45. Dynamische Arrays |
| |
Dynamische Arrays sind um einiges schneller als statische. Außerdem beseitigt der
Erase-Befehl nur dynamische Arrays vollständig aus dem
Speicher.
|
| |
 |
46. Toter Code |
| |
Es gibt mehrere Tools, die das Programm nach totem Code durchsuchen, wie z.B.
ungenutzen API-Funktionen oder Variablen. Bei einem
größeren Projekt kann einen die manuelle Suche zur Verzweiflung bringen.
Toter Code belegt Arbeitsspeicher und verlangsamt dadurch alles.
|
| |
 |
47. Variable Strings eliminieren |
| |
Strings mit variabler Länge können sehr viel Speicherplatz beanspruchen.
Wenn Sie diesen nicht mehr benötigen, sollten Sie den String löschen.
|
| |
 |
48. Keine Zeilennummern |
| |
Im Zuge der Abwärtskompatiblität erlaub Visual Basic das Verwenden von Zeilennummern,
die mit Hilfe von GoTo-Anweisungen angesprungen werden
können. Zeilennummern verbrauchen jedoch sehr viel Speicher, deshalb sollte man sie
nicht verwenden.
|
| |
 |
49. Debugging-Informationen |
| |
Löschen Sie diese sofort. Nicht nur, dass sie Arbeitsspeicher belegen. Sie können
auch Informationen beinhalten die End-User nicht sehen sollten.
|
| |
 |
50. P-Code oder Nativ-Code? |
| |
Sehr rechenintensive Programme sollten mit Nativ-Code kompiliert werden.
Wenn Kompabilität mit Debuggern und schnelle Ausführung gefragt ist sollte auch zum
Nativ-Code gegriffen werden. Jedoch sind Programme mit vielen String-Operationen
oder API-Aufrufen immer fast gleich schnell. P-Code wäre dann die bessere Lösung,
da diese Programme sehr klein sind.
|
| |
Selbst (sich selbst ernannte) VB-Profis dürften bei den obigen Optimierungs-Tipps noch einiges
dazugelernt haben.
Wie in vielen Lebenslagen gilt auch bei der Progammierung: Probieren geht über Studieren.
Testen Sie doch einfach einmal selber, welche von zwei Code-Möglichkeiten schneller ist.
Messen Sie die verstrichene Zeit z.B. mit der GetTickCount()-API.