Delphi-PRAXiS
Seite 2 von 3     12 3      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Laden von Array dauert sehr sehr lange (https://www.delphipraxis.net/13945-laden-von-array-dauert-sehr-sehr-lange.html)

sakura 29. Dez 2003 23:04

Re: Laden von Array dauert sehr sehr lange
 
Also wie folgend: (Hier auch gleich mal IntToStr(I) ersetzt ;-)
Code:
                for j := 0 to config_sl.Count - 1 do
                begin
                    [color=#ff0000]Dummy := config_sl.Strings[j];[/color]
                    [color=#2400ff]strI := IntToStr(i);[/color]
                    //Version auslesen
                    if (Pos([color=#2400ff]strI[/color] + '_HXPTT_XPVersion=', [color=#ff0000]Dummy[/color]) = 1) then
                    begin
                        pos_i := Pos('=', [color=#ff0000]Dummy[/color]);
                        xp_version_s := Copy([color=#ff0000]Dummy[/color], pos_i + 1, Length([color=#ff0000]Dummy[/color]));
                    end;

                    ... von hier an [color=#ff0000]Dummy[/color] ind [color=#2400ff]strI[/color] nutzen ;-)
...:cat:...

HomerGER 30. Dez 2003 00:38

Re: Laden von Array dauert sehr sehr lange
 
achso meinst du das
hmm
das bringt was ?
werde es propieren

HomerGER 30. Dez 2003 00:57

Re: Laden von Array dauert sehr sehr lange
 
hat schon einiges gebraucht
thx
ist zwar immer noch langsam aber viel besser als zum anfang - viel besser
werde noch den tip d3g propieren

sakura 30. Dez 2003 08:31

Re: Laden von Array dauert sehr sehr lange
 
Weitere Optimierungen, die Du überlegen solltest. Folgende Voraussetzungen:
  1. Der Wert vor dem ersten Underscore bestimmt die Position des Eintrags im Array
  2. Alle Wertenamen in der StringList werden mit einem "=" abgeschlossen.
  3. Einen Eintrag im Bereich von -1 existiert nicht

Unter diesen Voraussetzungen können wir auf die äußere Schleife (for i := 1 to k_max_xp_tweak_i d) komplett verzichten. Das gibt einen Perfomance-Gewinn im Bereich des k_max_xp_tweak_i-fachen!

Code:
for j := 0 to config_sl.Count - 1 do
begin
[color=#ff0000]{
  Als erstes holen wir uns den aktuellen String und zerlegen diesen in seine Einzelteile.
  [i]ValueName[/i] hält am Ende den Wert nach dem ersten Underscode bis vor dem "="
  [i]strIdx[/i] ist eine Helfervariable, welche den Wert vor dem ersten Underscore hält
  [i]Idx[/i] ist der Integerwert von strIdx, und speichert den gewünschten Index im Array
}[/color]
    // get current string
    Dummy := config_sl.Strings[j];
    // extract value name from current string
    ValueName := Copy(Dummy, 1, Pred(Pos('=', Dummy)));
    // extract index of value from string (first as string)
    strIdx := Copy(ValueName, 1, Pred(Pos('_', ValueName));
    // then as integer for array index
    Idx := StrToIntDef(strIdx, -1);
    if Idx = -1 then
        // invalid index, continue with next value in string list
        Continue;
    // remove index value from value name for faster string comparison
    Delete(ValueName, 1, Succ(Length(strIdx)));

    //Version auslesen
    if 'HXPTT_XPVersion' = ValueName then
        xp_version_s := Copy(Dummy, Succ(Pos('=', Dummy)), MaxInt);

    //XP Version prüfen
    if (XP_Version_Pruefen_GU(xp_version_s) = True) then
    begin
        //Daten ins Array schreiben
        //Titel
[color=#ff0000]{
  Ab hier fleißig mit ValueName arbeiten. Dadurch können auf weitere POS-Suchen,
  Stringverknüpfungen und Umwandlungen verzichtet werden ;-)
}[/color]
        if 'HXPTT_Titel' = ValueName then
            g_button_cfg_ar[Idx].titel_s := Copy(Dummy, Succ(Pos('=', Dummy)), MaxInt)

        //XPVersion
        else if 'HXPTT_XPVersion' = ValueName then
            g_button_cfg_ar[Idx].xpversion_s := Copy(Dummy, Succ(Pos('=', Dummy)), MaxInt)

        ... und so weiter und so fort ;-)
        else ....

    end;
end;
Abschließend solltest Du noch wissen, daß
Pred(Idx) = I - 1
und
Succ(Idx) = I + 1

...:cat:...

sakura 30. Dez 2003 16:57

Re: Laden von Array dauert sehr sehr lange
 
Und, wie sieht es jetzt aus :stupid:

...:cat:...

HomerGER 2. Jan 2004 18:42

Re: Laden von Array dauert sehr sehr lange
 
@sakura

ähhhhh
ich bin jetzt ein bischen ungläubig
hatte vor der änderung ca. 15:547 s
und jetzt
trau ich mich garnicht zu sagen

ca 00:031 !!!!!!!!!!!!!!!!

wie ist denn möglich

ich hab mit so ca. 5 - 7 s gerechnet



erkläre mal bitte

sakura 2. Jan 2004 18:56

Re: Laden von Array dauert sehr sehr lange
 
Zitat:

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.
    1. IntToStr(i) wird jedes mal ausgeführt
    2. Anschließend + '_HXPTT_Titel=' verbindest Du jedes Mal zwei Strings. Das ist generell recht langsam
    3. 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
    4. 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]));
    1. Wieder suchst Du im String... Das dauert natürlich eine Weile.
    2. 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 ;-)

...:cat:...

sakura 2. Jan 2004 19:00

Re: Laden von Array dauert sehr sehr lange
 
Von
Zitat:

Zitat von HomerGER
hmm so 1-2 min

nach
Zitat:

Zitat von HomerGER
15:547 s

auf
Zitat:

Zitat von HomerGER
00:031 s

:firejump: (Das musste noch raus :mrgreen: )

...:cat:...

HomerGER 2. Jan 2004 20:58

Re: Laden von Array dauert sehr sehr lange
 
tiefen dank

das mit den stringoperation war schon klar
das dort immer eine funktion aufgerufen wird

nur muss ich zugeben ich wußte nicht wie ich es anders hinbekommen sollte

noch mal neige ich mein haupt und bin dir und den anderen zum tiefen dank verpflichtet

sakura 2. Jan 2004 20:59

Re: Laden von Array dauert sehr sehr lange
 
:oops: Nicht gleich so dick auftragen, daß hat bei mir Nebenwirkungen :mrgreen:

Danke!

...:cat:...


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:41 Uhr.
Seite 2 von 3     12 3      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz