Optimierungsmethoden - Optimieren Sie Ihren VB-Code


 Zum vorherigen AbschnittZum nächsten Abschnitt Schnell vs. Langsam - Heizen Sie Ihrem Code ein
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:

 Zum vorherigen AbschnittZum nächsten Abschnitt In 50. Schritten zum schnellen Programm
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:
Y = (X = 5)

(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:
Y = Not X
 
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:
If Chr(Y) = "X" Then

ist langsamer als:
If Asc("X") = Y Then
 
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:
Set Objekt = Nothing
 
21. Objekte deklarieren
  Es gibt zwei Methoden, um Objekte zu deklarieren:
Dim Test As New <Objekt>
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:
Set <Form> = Nothing
 
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.
 

 Zum vorherigen AbschnittZum nächsten Abschnitt Probieren geht über Studieren
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.



Quellen: VB-Empire.de.vu, SHADOWare.de
Letzte Änderung: 18.07.2001
©2001 by SHADOWare, Thomas Bachem