Tutorial zur Delphi-Codeoptimierung:
String-Optimierung
Delphi verfügt über drei String-Typen: Short String (String[n], n=1..255). Der Speicherbereich wird statisch zugewiesen und die Größe wird zur Kompilierungszeit bestimmt. Dies wird von bp for geerbt Der Typ dos; Zeichenarray (pchar) dient hauptsächlich der Kompatibilität mit verschiedenen APIs und wird jetzt häufiger in Delphi verwendet. Sein Speicherbereich kann statisch mit einem Zeichenarray zugewiesen oder manuell mit getmem zugewiesen werden Lange Zeichen Ansistring ist einzigartig in Delphi. Sein Speicherbereich wird zur Laufzeit dynamisch zugewiesen, was am flexibelsten ist und am leichtesten missbraucht werden kann.
Der Standard-String-Typ AnsiString von Delphi wird ohne wiederholte Initialisierung automatisch auf leer initialisiert. Der folgende Code:
Delphi verfügt über drei String-Typen: Short String (String[n], n=1..255). Der Speicherbereich wird statisch zugewiesen und die Größe wird zur Kompilierungszeit bestimmt. Dies wird von bp for geerbt Der Typ dos; Zeichenarray (pchar) dient hauptsächlich der Kompatibilität mit verschiedenen APIs und wird jetzt häufiger in Delphi verwendet. Sein Speicherbereich kann statisch mit einem Zeichenarray zugewiesen oder manuell mit getmem zugewiesen werden Lange Zeichen Ansistring ist einzigartig in Delphi. Sein Speicherbereich wird zur Laufzeit dynamisch zugewiesen, was am flexibelsten ist und am leichtesten missbraucht werden kann.
vars:string;
beginnen
s:=;
…
Ende;
s:=; ist unnötig. Es ist jedoch zu beachten, dass dies keine Auswirkungen auf das Ergebnis des Funktionsrückgabewerts hat. Im Allgemeinen ist die Übergabe von Var-Argumenten schneller als die Rückgabe eines String-Werts.
Die Verwendung von SetLength zur Vorabzuweisung einer langen Zeichenfolge (AnsiString) zur dynamischen Zuweisung von Speicher ist ein großer Vorteil von AnsiString, kann jedoch leicht zunichte gemacht werden. Ein typisches Beispiel ist wie folgt:
s2:= ;
for i:=2 to length(s1) do s2:=s2+s1[i];
Ganz zu schweigen davon, dass es durch Löschen ersetzt werden kann. Das Hauptproblem besteht darin, dass der Speicherbereich von s2 in der Schleife des obigen Beispiels wiederholt zugewiesen wird, was ziemlich zeitaufwändig ist. Ein einfacher und effektiver Weg ist wie folgt:
setlength(s2, length(s1)-1);
for i:=2 to length(s1) do s2[i-1]:=s1[i];
Auf diese Weise wird der S2-Speicher nur einmal neu zugewiesen.
Thread-Sicherheit von Strings und dynamischen Arrays (Thread-Sicherheit) Vor Delphi 5 wurden diese nicht threadsicheren Aufrufe für Operationen an dynamischen Arrays und langen Strings durch Referenzzählung verarbeitet. Seit Delphi 5 wurden sie jedoch direkt auf einige Operationen geändert . Stellen Sie den kritischen Anweisungen die Sperranweisung voran, um dieses Problem zu vermeiden. Leider ist diese Modifikation ziemlich teuer, da der Sperrbefehl im Pentium II-Prozessor ziemlich zeitaufwändig ist und etwa 28 zusätzliche Befehlszyklen erforderlich sind, um diesen Vorgang abzuschließen, sodass die Gesamteffizienz um mindestens die Hälfte reduziert wird. Es gibt nur eine Möglichkeit, dieses Problem zu lösen, und zwar die Änderung des Kerncodes von Delphi RTL. Ersetzen Sie nach dem Sichern der Originaldatei alle Sperren in source/rtl/sys/system.pas durch {lock}. Natürlich muss das gesamte Wort ersetzt werden. Dies ist noch nicht vollständig optimiert. Der nächste Schritt besteht darin, die xchg-Anweisung zu entfernen, die auch in der Delphi4-Laufzeitbibliothek enthalten ist. Da diese Anweisung ein implizites Sperrpräfix hat, muss das xchg edx in den Prozessen _lstrasg und _strlasg in system.pas vorhanden sein entfernt. Ersetzen Sie [eax] durch den folgenden Code:
mov ecx,[eax]
mov[eax],edx
mov edx,ecx
Ok, fertig, kompilieren Sie es einfach und überschreiben Sie system.dcu. Auf diese Weise ist seine Ausführungseffizienz 6-mal höher als bei delphi5 und 2-mal höher als bei delphi4.