Was ist eine effiziente Software? Eine effiziente Software sollte nicht nur schneller laufen als Software, die die gleiche Funktion ausführt, sondern auch weniger Systemressourcen verbrauchen. Dieser Artikel fasst einige der Erfahrungen zusammen, die der Autor bei der Verwendung von VB für die Softwareentwicklung gesammelt hat, und zeigt Ihnen anhand einiger einfacher Beispiele, wie Sie effizienten VB-Code schreiben. Es enthält einige Techniken, die für VB-Programmierer sehr hilfreich sein können. Bevor ich anfange, möchte ich einige Konzepte klären.
Lassen Sie den Code sofort Gestalt annehmen: Unter den Programmierern, mit denen ich in Kontakt gekommen bin, schreiben viele den Code zunächst entsprechend den funktionalen Anforderungen und optimieren ihn dann auf dieser Basis. Am Ende stellten sie fest, dass sie den Code neu schreiben mussten, um eine Optimierung zu erreichen. Ich schlage daher vor, dass Sie vor dem Schreiben von Code über Optimierungsprobleme nachdenken.
Verstehen Sie den Zusammenhang zwischen den Ergebnissen der Optimierung und der erforderlichen Arbeit: Wenn ein Codeabschnitt fertiggestellt ist, müssen Sie ihn normalerweise überprüfen und ändern. Bei der Überprüfung des Codes stellen Sie möglicherweise fest, dass die Codeeffizienz in einigen Schleifen weiter verbessert werden kann. In diesem Fall ändern viele Programmierer, die nach Perfektion streben, den Code möglicherweise sofort. Mein Vorschlag ist, dass Sie ihn ändern können, wenn eine Änderung dieses Codes die Laufzeit des Programms um eine Sekunde verkürzt. Wenn dadurch nur eine Leistungsverbesserung von 10 Millisekunden erreicht werden kann, werden keine Änderungen vorgenommen. Dies liegt daran, dass das Umschreiben eines Codeabschnitts unweigerlich zu neuen Fehlern führt und das Debuggen von neuem Code definitiv eine gewisse Zeit in Anspruch nehmen wird. Programmierer sollten ein Gleichgewicht zwischen Softwareleistung und dem für die Entwicklung der Software erforderlichen Arbeitsaufwand finden, und 10 Millisekunden sind ein Unterschied, den Benutzer nicht schätzen können.
Versuchen Sie, objektorientierte Methoden zu verwenden, wenn Sie diese benötigen. Der von VB bereitgestellte Mechanismus unterstützt objektorientiertes Design und Codierung nicht vollständig, VB stellt jedoch einfache Klassen bereit. Die meisten Leute glauben, dass die Verwendung von Objekten zu weniger effizientem Code führt. Ich persönlich habe in diesem Punkt unterschiedliche Meinungen; die Effizienz von Code kann nicht nur aus der Perspektive der Laufgeschwindigkeit beurteilt werden. Auch die von der Software beanspruchten Ressourcen sind einer der Faktoren, die berücksichtigt werden müssen. Mithilfe von Klassen können Sie die Gesamtleistung Ihrer Software verbessern, was ich in späteren Beispielen ausführlich erläutern werde.
Wenn Sie VB-Code schreiben, hoffe ich, dass Sie die oben genannten Punkte als Grundsätze für Ihre Codierung verwenden können. Ich habe den Artikel in zwei Teile unterteilt: Wie man die Ausführungsgeschwindigkeit des Codes verbessert und wie man die Kompilierung optimiert.
So läuft Ihr Code schneller
Die folgenden Methoden können Ihnen dabei helfen, die Geschwindigkeit Ihres Codes zu verbessern:
1. Verwenden Sie Ganzzahlen (Integer) und lange Ganzzahlen (Long).
Der einfachste Weg, die Ausführung Ihres Codes zu beschleunigen, besteht darin, die richtigen Datentypen zu verwenden. Sie glauben es vielleicht nicht, aber die Wahl des richtigen Datentyps kann die Leistung Ihres Codes erheblich verbessern. In den meisten Fällen können Programmierer Variablen vom Typ „Single“, „Double“ und „Währung“ durch Variablen vom Typ „Integer“ oder „Long“ ersetzen, da die Fähigkeit von VB, mit „Integer“ und „Long“ umzugehen, viel höher ist als bei anderen Datentypen.
In den meisten Fällen entscheiden sich Programmierer für die Verwendung von Single oder Double, weil sie Dezimalstellen speichern können. Dezimalzahlen können aber auch in Variablen vom Typ Integer gespeichert werden. Wenn im Programm beispielsweise drei Dezimalstellen vereinbart sind, müssen Sie nur den in der Variablen „Integer“ gespeicherten Wert durch 1000 dividieren, um das Ergebnis zu erhalten. Meiner Erfahrung nach kann Code durch die Verwendung von Integer und Long anstelle von Single, Double und Currency fast zehnmal schneller ausgeführt werden.
2. Vermeiden Sie die Verwendung von Varianten
Für einen VB-Programmierer ist dies offensichtlich. Variablen vom Typ Variant benötigen 16 Byte Speicherplatz zum Speichern von Daten, während eine Ganzzahl (Integer) nur 2 Byte benötigt. Der Zweck der Verwendung von Variantentypen besteht normalerweise darin, den Designaufwand und die Codemenge zu reduzieren. Einige Programmierer verwenden sie auch, um Ärger zu sparen. Wenn eine Software jedoch streng nach Spezifikationen entworfen und codiert wird, kann die Verwendung von Variantentypen vollständig vermieden werden.
Das gleiche Problem besteht übrigens auch für Object-Objekte. Bitte schauen Sie sich den folgenden Code an:
mFSO
SetFSO=NewScripting.FileSystemObject
oder
DimFSOasobject
SetFSO=NewScripting.FileSystemObject
Da der obige Code bei der Deklaration den Datentyp nicht angibt, werden bei der Zuweisung Speicher und CPU-Zeit verschwendet. Der richtige Code sollte so aussehen:
DimFSOasNewFileSystemObject
3. Vermeiden Sie die Verwendung von Attributen
Im täglichen Code besteht der häufigste ineffiziente Code darin, dass Eigenschaften (Eigenschaften) wiederholt verwendet werden, wenn Variablen verwendet werden können, insbesondere in Schleifen. Sie müssen wissen, dass die Geschwindigkeit beim Zugriff auf Variablen etwa 20-mal höher ist als beim Zugriff auf Attribute. Der folgende Code wird von vielen Programmierern in ihren Programmen verwendet:
DimintConasInteger
ForintCon=0toUbound(SomVar())
Text1.Text=Text1.Text&vbcrlf&SomeVar(intCon)
NextintCon
Der folgende Code wird 20-mal schneller ausgeführt als der obige Code.
DimintConasInteger
DimsOutputasString
ForintCon=0toUbound(SomeVar())
sOutput=sOutput&vbCrlf&
SomeVar(intCon)
Nächste
Text1.Text=sOutput
4. Versuchen Sie, Arrays zu verwenden und vermeiden Sie die Verwendung von Mengen
Sofern Sie keine Sammlung verwenden müssen, sollten Sie immer ein Array verwenden. Tests zufolge kann die Zugriffsgeschwindigkeit von Arrays das Hundertfache der Zugriffsgeschwindigkeit von Sammlungen erreichen. Diese Zahl klingt ein wenig schockierend, aber wenn man bedenkt, dass eine Sammlung ein Objekt ist, wird man verstehen, warum der Unterschied so groß ist.
5. Erweitern Sie den kleinen Schleifenkörper
Beim Codieren kann die folgende Situation auftreten: Ein Schleifenkörper wird nur zwei- oder dreimal wiederholt und der Schleifenkörper besteht aus mehreren Codezeilen. In diesem Fall können Sie die Schleife abrollen. Der Grund dafür ist, dass die Schleife zusätzliche CPU-Zeit beansprucht. Wenn die Schleife jedoch komplexer ist, ist dies nicht erforderlich.
6. Vermeiden Sie die Verwendung sehr kurzer Funktionen
Wie bei der Verwendung kleiner Schleifen ist es unwirtschaftlich, eine Funktion mit nur wenigen Codezeilen aufzurufen – der Aufruf der Funktion kann länger dauern als die Ausführung des Codes in der Funktion. In diesem Fall können Sie den Code in der Funktion an die Stelle kopieren, an der die Funktion ursprünglich aufgerufen wurde.
7. Reduzieren Sie Verweise auf Unterobjekte
In VB werden Objektreferenzen mithilfe von implementiert. Zum Beispiel:
Form1.Text1.Text
Im obigen Beispiel referenziert das Programm zwei Objekte: Form1 und Text1. Das Zitieren mit dieser Methode ist ineffizient. Aber leider gibt es keine Möglichkeit, es zu vermeiden. Das Einzige, was der Programmierer tun kann, ist, With zu verwenden oder das untergeordnete Objekt (Text1) mit einem anderen Objekt zu speichern.
Hinweis: Verwenden Sie mit
WithfrmMain.Text1
.Text="LearnVB"
.Ausrichtung=0
.Tag="Itsmylife"
.BackColor=vbBlack
.ForeColor=vbWhite
EndWith
oder
Hinweis: Verwenden Sie ein anderes Objekt, um das untergeordnete Objekt zu speichern
DimtxtTextBoxasTextBox
SettxtTextBox=frmMain.Text1
TxtTextBox.Text="LearnVB"
TxtTextBox.Alignment=0
TxtTextBox.Tag="Itsmylife"
TxtTextBox.BackColor=vbBlack
TxtTextBox.ForeColor=vbWhite
Beachten Sie, dass die oben genannte Methode nur anwendbar ist, wenn Sie Unterobjekte eines Objekts bearbeiten müssen. Der folgende Code ist falsch:
MitText1
.Text="LearnVB"
.Ausrichtung=0
.Tag="Itsmylife"
.BackColor=vbBlack
.ForeColor=vbWhite
EndWith
Leider finden wir im tatsächlichen Code häufig Code, der dem oben genannten ähnelt. Dadurch wird die Codeausführung nur langsamer. Der Grund dafür ist, dass der With-Block nach der Kompilierung einen Zweig bildet, was zusätzlichen Verarbeitungsaufwand verursacht.
8. Überprüfen Sie, ob die Zeichenfolge leer ist
Die meisten Programmierer verwenden die folgende Methode, um zu prüfen, ob eine Zeichenfolge leer ist:
IfText1.Text=""then
Hinweis: Führen Sie eine Aktion aus
Endif
Leider erfordert das Durchführen von Zeichenfolgenvergleichen noch mehr Verarbeitung als das Lesen von Eigenschaften. Daher empfehle ich Ihnen, die folgende Methode zu verwenden:
IfLen(Text1.Text)=0then
Hinweis: Führen Sie eine Aktion aus
Endif
9. Variablenname nach dem Entfernen des Next-Schlüsselworts
Das Hinzufügen des Variablennamens nach dem Schlüsselwort Next führt dazu, dass die Effizienz des Codes abnimmt. Ich weiß nicht, warum das passiert, es ist nur eine Erfahrung. Ich glaube jedoch, dass nur sehr wenige Programmierer so weit gehen würden, überflüssige Informationen hinzuzufügen. Schließlich sind die meisten Programmierer Menschen, die Worte wie Gold schätzen.
Kommentar: Falscher Code
ForiCount=1to10
Hinweis: Führen Sie eine Aktion aus
NextiCount
Hinweis: Korrekter Code
ForiCount=1to10
Hinweis: Führen Sie eine Aktion aus
Nächste
10. Verwenden Sie Arrays anstelle mehrerer Variablen
Wenn Sie mehrere Variablen haben, die ähnliche Daten enthalten, sollten Sie erwägen, diese durch ein Array zu ersetzen. In VB gehören Arrays zu den effizientesten Datenstrukturen.
11. Verwenden Sie dynamische Arrays anstelle statischer Arrays
Die Verwendung dynamischer Arrays hat keinen großen Einfluss auf die Ausführungsgeschwindigkeit des Codes, kann jedoch in einigen Fällen viele Ressourcen einsparen.
12. Zerstöre Gegenstände
Unabhängig davon, welche Art von Software geschrieben wird, müssen Programmierer in Betracht ziehen, den von der Software belegten Speicherplatz freizugeben, nachdem der Benutzer beschließt, die Software zu beenden. Aber leider scheinen sich viele Programmierer nicht besonders darum zu kümmern. Der richtige Ansatz besteht darin, die im Programm verwendeten Objekte zu zerstören, bevor das Programm beendet wird. Zum Beispiel:
DimFSOasNewFileSystemObject
Hinweis: Führen Sie eine Aktion aus
Hinweis: Zerstören Sie das Objekt
SetFSO=Nichts
Für Formulare können Sie Folgendes deinstallieren:
UnloadfrmMain
oder
SetfrmMain=Nichts
13. Zeichenfolgen variabler und fester Länge
Technisch gesehen erfordern Zeichenfolgen fester Länge weniger Verarbeitungszeit und Platz als Zeichenfolgen variabler Länge. Der Nachteil von Zeichenfolgen fester Länge besteht jedoch darin, dass Sie in vielen Fällen die Trim-Funktion aufrufen müssen, um das Nullzeichen am Ende der Zeichenfolge zu entfernen, was die Codeeffizienz verringert. Sofern sich die Länge der Zeichenfolge also nicht ändert, verwenden Sie Zeichenfolgen variabler Länge.
14. Verwenden Sie Klassenmodule anstelle von ActiveX-Steuerelementen
Sofern ActiveX-Steuerelemente keine Benutzeroberflächen beinhalten, versuchen Sie, leichtgewichtige Objekte wie Klassen zu verwenden. Es gibt einen großen Unterschied in der Effizienz zwischen den beiden.
15. Verwenden Sie interne Objekte
Wenn es um die Verwendung von ActiveX-Steuerelementen und DLLs geht, kompilieren viele Programmierer diese gerne und fügen sie dann dem Projekt hinzu. Ich würde Ihnen raten, dies nicht zu tun, da die Verbindung zu einem externen Objekt von VB aus viel CPU-Rechenleistung erfordert. Jedes Mal, wenn Sie eine Methode aufrufen oder auf eine Eigenschaft zugreifen, verschwenden Sie eine Menge Systemressourcen. Wenn Sie über den Quellcode für ein ActiveX-Steuerelement oder eine DLL verfügen, machen Sie diese zu privaten Objekten im Projekt.
16. Reduzieren Sie die Anzahl der Module
Manche Leute behalten gerne gemeinsame Funktionen in Modulen bei, und dem stimme ich zu. Aber nur zwanzig oder dreißig Zeilen Code in einem Modul zu schreiben, ist etwas lächerlich. Wenn Sie ein Modul nicht wirklich benötigen, versuchen Sie, es nicht zu verwenden. Der Grund dafür ist, dass VB Module nur dann in den Speicher lädt, wenn Funktionen oder Variablen im Modul aufgerufen werden; diese Module werden aus dem Speicher entladen, wenn die VB-Anwendung beendet wird. Wenn der Code nur ein Modul enthält, führt VB nur einen Ladevorgang aus, sodass die Effizienz des Codes verbessert wird. Wenn der Code hingegen mehrere Module enthält, führt VB mehrere Ladevorgänge aus und die Effizienz von Der Code wird reduziert.
17. Verwenden Sie Objektarrays
Beim Entwerfen von Benutzeroberflächen sollten Programmierer versuchen, Objektarrays für Steuerelemente desselben Typs zu verwenden. Sie können ein Experiment durchführen: Fügen Sie dem Fenster 100 PictureBoxes mit jeweils unterschiedlichen Namen hinzu und führen Sie das Programm aus. Erstellen Sie dann ein neues Projekt und fügen Sie dem Fenster auch 100 PictureBoxes hinzu. Verwenden Sie dieses Mal jedoch ein Objektarray und führen Sie das Programm aus. Sie können den Unterschied in der Ladezeit der beiden Programme feststellen.
18. Verwenden Sie die Move-Methode
Beim Ändern der Position eines Objekts verwenden einige Programmierer gerne die Eigenschaften „Width“, „Height“, „Top“ und „Left“. Zum Beispiel:
Bild1.Width=100
Image1.Height=100
Bild1.Top=0
Bild1.Links=0
Tatsächlich ist dies sehr ineffizient, da das Programm vier Eigenschaften ändert und das Fenster nach jeder Änderung neu gezeichnet wird. Der richtige Ansatz ist die Verwendung der Move-Methode:
Bild1.Move0,0,100,100
19. Reduzieren Sie die Verwendung von Bildern
Bilder beanspruchen viel Speicher und die Verarbeitung von Bildern beansprucht auch viele CPU-Ressourcen. Erwägen Sie bei Software nach Möglichkeit die Verwendung von Hintergrundfarben anstelle von Bildern – dies ist natürlich nur die Sichtweise eines Technikers zu diesem Thema.
20. Verwenden Sie ActiveXDLL anstelle von ActiveX-Steuerelementen
Wenn das von Ihnen entworfene ActiveX-Objekt keine Benutzeroberfläche umfasst, verwenden Sie ActiveXDLL.
Kompilierungsoptimierung
Viele VB-Programmierer, die ich getroffen habe, haben noch nie Kompilierungsoptionen verwendet oder versucht, die Unterschiede zwischen den Optionen herauszufinden. Werfen wir einen Blick auf die spezifische Bedeutung jeder Option.
1.P-Code (Pseudocode) und nativer Code
Sie können wählen, ob Sie die Software in P-Code oder nativen Code kompilieren möchten. Die Standardoption ist nativer Code. Was sind also P-Code und nativer Code?
P-Code: Beim Ausführen von Code in VB kompiliert VB den Code zunächst in P-Code und interpretiert dann den kompilierten P-Code und führt ihn aus. In einer kompilierten Umgebung ist die Verwendung dieses Codes schneller als die Verwendung von nativem Code. Nach Auswahl von P-Code fügt VB beim Kompilieren den Pseudocode in eine EXE-Datei ein.
Nativer Code: Nativer Code ist eine Option, die erst nach VB6 eingeführt wurde. Beim Kompilieren in eine EXE-Datei wird nativer Code schneller ausgeführt als P-Code. Nach Auswahl des nativen Codes generiert VB beim Kompilieren mithilfe von Maschinenanweisungen eine EXE-Datei.
Beim Kompilieren mit nativem Code stelle ich fest, dass manchmal unerklärliche Fehler auftreten. Mein Code wird in der Kompilierungsumgebung völlig korrekt ausgeführt, aber die mit der Option „Native Code“ generierte EXE-Datei wird nicht korrekt ausgeführt. Normalerweise geschieht dies, wenn ein Fenster entladen wird oder ein Druckfenster erscheint. Ich habe dieses Problem gelöst, indem ich dem Code eine DoEvent-Anweisung hinzugefügt habe. Natürlich ist die Wahrscheinlichkeit, dass so etwas passiert, sehr gering. Vielleicht sind einige VB-Programmierer noch nie darauf gestoßen, aber es existiert.
Es gibt auch mehrere Optionen im nativen Code:
a) Optimierung der Codegeschwindigkeit: Mit dieser Option kann eine schnellere ausführbare Datei kompiliert werden, die ausführbare Datei ist jedoch größer. Empfohlen
b) Optimierung der Codegröße: Diese Option kann eine kleinere ausführbare Datei kompilieren, wird jedoch auf Kosten der Geschwindigkeit nicht empfohlen.
c) Keine Optimierung: Diese Option konvertiert nur P-Code in nativen Code ohne jegliche Optimierung. Kann beim Debuggen von Code verwendet werden.
d) Optimiert für Pentium Pro: Obwohl diese Option im nativen Code nicht die Standardoption ist, verwende ich sie normalerweise. Das mit dieser Option kompilierte ausführbare Programm kann auf PentiumPro- und Pentium2-Rechnern oder höher schneller laufen, ist aber auf älteren Rechnern etwas langsamer. Da die Verwendung von Pentium2 mittlerweile veraltet ist, wird jedem empfohlen, diese Option zu nutzen.
e) Symbolische Debugging-Informationen generieren: Dieses Element generiert während des Kompilierungsprozesses einige Debugging-Informationen, sodass Benutzer Tools wie Visual C++ zum Debuggen des kompilierten Codes verwenden können. Mit dieser Option wird eine PDF-Datei generiert, die die Flag-Informationen in der ausführbaren Datei aufzeichnet. Diese Option ist hilfreich, wenn das Programm über API-Funktionen oder DLL-Aufrufe verfügt.
2. Erweiterte Optimierung
Die Einstellungen in der erweiterten Optimierung können Ihnen helfen, die Geschwindigkeit Ihrer Software zu verbessern, aber manchmal können sie zu Fehlern führen, daher empfehle ich Ihnen, sie so sorgfältig wie möglich zu verwenden. Wenn der Code relativ große Schleifenkörper oder komplexe mathematische Operationen enthält, kann die Auswahl bestimmter Elemente in der erweiterten Optimierung die Leistung des Codes erheblich verbessern. Wenn Sie erweiterte Optimierungsfunktionen verwenden, empfehle ich, die kompilierten Dateien gründlich zu testen.
a) Angenommen, kein Alias: Es kann die Ausführungseffizienz des Codes im Schleifenkörper verbessern, aber wenn der Variablenwert durch die Variablenreferenz geändert wird, z. B. durch Aufrufen einer Methode, wird die Variablenreferenz als Parameter der Methode verwendet. und der Variablenwert im Methodenwert geändert wird, wird ein Fehler ausgelöst. Möglicherweise ist das zurückgegebene Ergebnis falsch oder es liegt ein schwerwiegender Fehler vor, der zu einer Programmunterbrechung führt.
b) Array-Bindungsprüfung abbrechen, Ganzzahlüberlaufprüfung abbrechen und Gleitkomma-Fehlerprüfung abbrechen: Wenn bei der Ausführung des Programms bei diesen Prüfungen Fehler gefunden werden, behandelt der Fehlerbehandlungscode diese Fehler. Wenn diese Prüfungen jedoch abgebrochen werden, kann das Programm einen Fehler nicht behandeln. Sie sollten diese Optionen nur verwenden, wenn Sie sicher sind, dass die oben genannten Fehler in Ihrem Code nicht auftreten. Sie werden die Leistung der Software erheblich verbessern.
c) Gleitkommaoperationen ohne Rundung zulassen: Durch Auswahl dieser Option kann das kompilierte Programm Gleitkommaoperationen schneller verarbeiten. Der einzige Nachteil besteht darin, dass es beim Vergleich zweier Gleitkommazahlen zu falschen Ergebnissen kommen kann.
d) PentiumFDIV-Sicherheitsprüfung abbrechen: Diese Option ist für einige alte Pentium-Chips gesetzt und scheint mittlerweile veraltet zu sein