Einzelnen Beitrag anzeigen

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