Zitat von
HomerGER:
wie ist denn möglich [...] erkläre mal bitte
Gerne.
Die erste und wohl größte Verbesserung ist es gewesen, die Schleife
for I := 0 to k_max_xp_tweak_i zu entfernen. Dadurch sparst Du Dir "k_max_xp_tweak_i" Läufe durch die gesamte StringListe
config_sl ein. Das ist schon mal ein direkter Performancegewinn, der einlauchten sollte.
Der nächste wichtige Punkt war es die String-Operationen zu optimieren. Delphi hat zwar mit die besten Stringroutinen, die es gibt, aber man kann es immer etwas beeinflussen. So zum Beispiel folgende Deiner Punkte
- Mehrfach nutzt Du ein Konstrukt folgender Art if Pos(IntToStr(i) + '_HXPTT_Titel=', config_sl.Strings[j]) = 1 then...
Dieses Konstrukt hat mehrere Nachteile.- IntToStr(i) wird jedes mal ausgeführt
- Anschließend + '_HXPTT_Titel=' verbindest Du jedes Mal zwei Strings. Das ist generell recht langsam
- Dann kommt jedes Mal Pos. Dieses ist recht schnell, wenn ein Match gefunden wird, wird es jedoch nicht gefunden, muss jedes Mal der gesamte (dynamische) String umsonst durchsucht werden
- anschließend der Vergleich = 1, nachdem bereits der Stringvergleich stattfand. Der ist nicht mehr tragisch, aber trägt zur Zeitrechnung hinzu
- Weiter geht es mit
pos_i := Pos('=', config_sl.Strings[j]);
xp_version_s := Copy(config_sl.Strings[j], pos_i + 1, Length(config_sl.Strings[j]));
- Wieder suchst Du im String... Das dauert natürlich eine Weile.
- Im Copy übergibst Du als letztes die Länge des Strings, was als solches schon unlogisch ist, da Du Länge - Position des "=" kopieren willst. Weiter kommt, das Copy intern eh die maximale Anzahl der zu kopierenden Zeichen ermittelt, damit kannst Du gleich MaxInt übergeben, da alles bis zum Schluss kopiert werden soll.
- Die restlichen Optimierungen kommen durch die Aufbereitung der Variablen am Anfang und den Zugriff auf die fertigen Variablenwerte anstatt diese in jedem if neu zu ermitteln
Ich hoffe, daß das einen kleinen Einblick in die Optimierungslogik gibt. Man könnte noch eine Menge rausholen, aber ich glaube die aktuellen Werte sind gut genug, daß weiterer Aufwand hier nicht lohnen würde
...
...