AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Laden von Array dauert sehr sehr lange

Ein Thema von HomerGER · begonnen am 29. Dez 2003 · letzter Beitrag vom 3. Jan 2004
Antwort Antwort
Seite 2 von 3     12 3      
Benutzerbild von sakura
sakura

Registriert seit: 10. Jun 2002
Ort: München
11.412 Beiträge
 
Delphi 11 Alexandria
 
#11

Re: Laden von Array dauert sehr sehr lange

  Alt 29. Dez 2003, 23:04
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 ;-)
......
Daniel W.
Ich bin nicht zurück, ich tue nur so
  Mit Zitat antworten Zitat
Benutzerbild von HomerGER
HomerGER

Registriert seit: 8. Jun 2003
390 Beiträge
 
Delphi 7 Professional
 
#12

Re: Laden von Array dauert sehr sehr lange

  Alt 30. Dez 2003, 00:38
achso meinst du das
hmm
das bringt was ?
werde es propieren
  Mit Zitat antworten Zitat
Benutzerbild von HomerGER
HomerGER

Registriert seit: 8. Jun 2003
390 Beiträge
 
Delphi 7 Professional
 
#13

Re: Laden von Array dauert sehr sehr lange

  Alt 30. Dez 2003, 00:57
hat schon einiges gebraucht
thx
ist zwar immer noch langsam aber viel besser als zum anfang - viel besser
werde noch den tip d3g propieren
  Mit Zitat antworten Zitat
Benutzerbild von sakura
sakura

Registriert seit: 10. Jun 2002
Ort: München
11.412 Beiträge
 
Delphi 11 Alexandria
 
#14

Re: Laden von Array dauert sehr sehr lange

  Alt 30. Dez 2003, 08:31
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

......
Daniel W.
Ich bin nicht zurück, ich tue nur so
  Mit Zitat antworten Zitat
Benutzerbild von sakura
sakura

Registriert seit: 10. Jun 2002
Ort: München
11.412 Beiträge
 
Delphi 11 Alexandria
 
#15

Re: Laden von Array dauert sehr sehr lange

  Alt 30. Dez 2003, 16:57
Und, wie sieht es jetzt aus

......
Daniel W.
Ich bin nicht zurück, ich tue nur so
  Mit Zitat antworten Zitat
Benutzerbild von HomerGER
HomerGER

Registriert seit: 8. Jun 2003
390 Beiträge
 
Delphi 7 Professional
 
#16

Re: Laden von Array dauert sehr sehr lange

  Alt 2. Jan 2004, 18:42
@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
  Mit Zitat antworten Zitat
Benutzerbild von sakura
sakura

Registriert seit: 10. Jun 2002
Ort: München
11.412 Beiträge
 
Delphi 11 Alexandria
 
#17

Re: Laden von Array dauert sehr sehr lange

  Alt 2. Jan 2004, 18:56
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

......
Daniel W.
Ich bin nicht zurück, ich tue nur so
  Mit Zitat antworten Zitat
Benutzerbild von sakura
sakura

Registriert seit: 10. Jun 2002
Ort: München
11.412 Beiträge
 
Delphi 11 Alexandria
 
#18

Re: Laden von Array dauert sehr sehr lange

  Alt 2. Jan 2004, 19:00
Von
Zitat von HomerGER:
hmm so 1-2 min
nach
Zitat von HomerGER:
15:547 s
auf
Zitat von HomerGER:
00:031 s
(Das musste noch raus )

......
Daniel W.
Ich bin nicht zurück, ich tue nur so
  Mit Zitat antworten Zitat
Benutzerbild von HomerGER
HomerGER

Registriert seit: 8. Jun 2003
390 Beiträge
 
Delphi 7 Professional
 
#19

Re: Laden von Array dauert sehr sehr lange

  Alt 2. Jan 2004, 20:58
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
  Mit Zitat antworten Zitat
Benutzerbild von sakura
sakura

Registriert seit: 10. Jun 2002
Ort: München
11.412 Beiträge
 
Delphi 11 Alexandria
 
#20

Re: Laden von Array dauert sehr sehr lange

  Alt 2. Jan 2004, 20:59
Nicht gleich so dick auftragen, daß hat bei mir Nebenwirkungen

Danke!

......
Daniel W.
Ich bin nicht zurück, ich tue nur so
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 3     12 3      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:05 Uhr.
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