Delphi-PRAXiS
Seite 1 von 5  1 23     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi TStringlist, THashedStringlist gibts nichts schnelleres?? (https://www.delphipraxis.net/149517-tstringlist-thashedstringlist-gibts-nichts-schnelleres.html)

Franzelchen 23. Mär 2010 12:12


TStringlist, THashedStringlist gibts nichts schnelleres??
 
Hallo DPler,

TStringlist, THashedStringlist gibts nichts schnelleres?? und genauso komfortables. Ich meine die Funktionen Stringlist.LoadfromFile .SavetoFile .Strings[i].

himitsu 23. Mär 2010 12:41

Re: TStringlist, THashedStringlist gibts nichts schnelleres?
 
Zitat:

Zitat von Franzelchen
Ich meine die Funktionen .LoadfromFile .SavetoFile

Nein, denn überall muß die Datei eingelesen, zerlegt und die Strings im "RAM" abgelegt werden.
Und bei der THashedStringList muß zusätzlich noch pro String ein Hash beechnet werden.

.Strings[i] ist bei der "normalen" StringList oder bei einem Array am schnellsten, da man dort direkt via Index zugreifen kann.
Bei der HashedStringList, SkipList und ihren Verwandten kommt es dann darauf an, ob neben der HashMap auch noch eine Index-Liste existiert.

Das schnellste LoadfromFile wäre alles in EINEN String oder einen MemoryStream zu lesen, aber dann gibt es keinen Index und man kann nicht direkt via .Strings[i] zugreifen.

PS: Wenn nur via .Strings[i] zugegriffen wird, dann ist die THashedStringList vollkommen überflüssig, weil sie auf eine Stringsuche ausgelegt ist und nicht für einen Indexzugriff.

Franzelchen 23. Mär 2010 12:46

Re: TStringlist, THashedStringlist gibts nichts schnelleres?
 
Natürlich gibt es die vielbeschworene Skiplist. Diese würde sogar (vgl. Suchverfahren mit Beispielen) meine Dateigröße abdecken( ca.40 000 Datensätze) aber wie verwende ich die Skiplist. In allen Beispielen wird die Skiplist mit Zufallsstrings aufgefüllt aber nie mit echten Daten.
Also wie bekomme ich eine Datei in die Skiplist (LoadfromFile) und wie kann ich mit der Skiplist arbeiten (Strings[i]) und wie Speichere ich die Daten der Skiplist (SaveToFile).

himitsu 23. Mär 2010 12:52

Re: TStringlist, THashedStringlist gibts nichts schnelleres?
 
Zitat:

Zitat von Franzelchen
Natürlich gibt es die vielbeschworene Skiplist.

Ließ bitte mal alles, auch das, welches ich noch nacheditiert hab.

Wenn du nur .LoadFromFile .SavetoFile und .Strings[i] verwendest, dann ist TStringList mitunder das Schnellste.

Schneller geht es nur (wenn die Liste nicht im Programm verändert werden soll oder wenn SaveToFile etwas länger dauern darf), wenn man alles an einem Stück einließt und dann nur eine Indexliste mit den Stringanfängen/-längen anlegt und wenn auf alle Strings/Zeilen maximal ein-/zweimal zugegriffen wird oder wenn einem der Speicherverbrauch für eine doppelte Datenhaltung egal ist.

Franzelchen 23. Mär 2010 13:05

Re: TStringlist, THashedStringlist gibts nichts schnelleres?
 
Zitat:

Zitat von himitsu

Wenn du nur .LoadFromFile .SavetoFile und .Strings[i] verwendest, dann ist TStringList mitunder das Schnellste.

Da ich außer dem genannten nur noch .sort verwende habe ich also Pech gehabt. Schade.

himitsu 23. Mär 2010 13:23

Re: TStringlist, THashedStringlist gibts nichts schnelleres?
 
Wenn du "sehr oft" etwas ändern/einfügen/löschen und auch sortieren würdest und "selten" via .Strings[i] zugreifst, dann wäre eine HashList ('ne SkipList ist auch eine) insgesamt schon schneller. :angel2:

Franzelchen 23. Mär 2010 13:31

Re: TStringlist, THashedStringlist gibts nichts schnelleres?
 
Ich benötige die Stringliste nur zum sortieren,laden,speichern und sehr häufig die .Strings[i] Funktion. Das sortieren benötigt die geringste Zeit, es wäre schon ein erheblicher Fortschritt wenn es einen Weg gäbe der die .Strings[i] Verarbeitung beschleunigen würde.

himitsu 23. Mär 2010 13:48

Re: TStringlist, THashedStringlist gibts nichts schnelleres?
 
Delphi-Quellcode:
property Strings[Index: Integer]: string read Get write Put; default;

function TStringList.Get(Index: Integer): string;
begin
  if Cardinal(Index) >= Cardinal(FCount) then
    Error(@SListIndexError, Index);
  Result := FList^[Index].FString;
end;
Wie gesagt, .Strings von TStringList (TStrings) ist schon ein direkter Zugriff und schneller als direkt geht es einfach nicht,
außer man nimmt direkt ein dynamisches Array ohne aktivierte Indexprüfung. (siehe Compiler-Schalter oder Projektoptionen)

alzaimar 23. Mär 2010 14:00

Re: TStringlist, THashedStringlist gibts nichts schnelleres?
 
Zitat:

Zitat von Franzelchen
Natürlich gibt es die vielbeschworene Skiplist. Diese würde sogar (vgl. Suchverfahren mit Beispielen) meine Dateigröße abdecken( ca.40 000 Datensätze) aber wie verwende ich die Skiplist. In allen Beispielen wird die Skiplist mit Zufallsstrings aufgefüllt aber nie mit echten Daten.

Wo ist denn da nun bitte der Unterschied?
Delphi-Quellcode:
MyList.Add(MyKeyString, MyData)
Wo ist eigentlich dein Problem? Selbst 40.000 Datensätze sind doch in Null,Nix eingelesen über eine TStringlist eingelesen. Der Zugriff erfolgt auch schnell genug, und selbst die Suche in einer sortieren Stringlist wäre doch kein Problem, oder?

Zeig uns doch mal den Code, bei dem Du Performanceprobleme bekommst.

Wenn Du noch eine Nanosekunde rausholen willst, dann vergiss die TStringlist und verwende ein ARRAY OF STRING. Das vermeidet den Umweg über einen Getter-Aufruf. Aber verwende keine dynamischs Array weil das ja wieder erst umständlich und performancefressend dereferenziert werden muss :gruebel: :zwinker:

Delphi-Quellcode:
Type
  TTheMotherOfAllSchnelleStringZugriffe = ARRAY [0..39999] OF STRING;
Oder geht es noch schneller?

Franzelchen 23. Mär 2010 15:27

Re: TStringlist, THashedStringlist gibts nichts schnelleres?
 
Hier der Code

Delphi-Quellcode:
begin
Screen.Cursor := crHourGlass;
startZeit := now;
  x:=tstringlist.Create;
  x.LoadFromFile('C:\DB\DatenTest.tmp');

  x.Text:= StringReplace(x.Text,'ß','SSSSSSS', [rfReplaceAll]);
  x.Sort;
  x.Text:= StringReplace(x.Text,'SSSSSSS','ß',[rfReplaceAll]);

  x.SaveToFile('sortiert.txt');


// ab hier wird es extrem langsam

  a:=0;
  stringgrid1.RowCount:=1;           //löscht überflüssige Leerzeilen
  for b:=0 to x.count-1 do
  begin
   progressbar6.Max:= x.Count-1 ;
   progressbar6.position:=b ;
   progressbar6.Update;
      if b>0 then begin
       if x.strings[b]=x.Strings[b-1] then begin
          StringGrid1.cells[1,a]:= inttostr(strtoint (StringGrid1.cells[1,a])+1)
      end else begin
               inc(a);
               StringGrid1.cells[1,a] := '1';
               StringGrid1.cells[0,a] := x.strings[b];
               StringGrid1.RowCount := StringGrid1.RowCount+1;
               end;
      end else begin
               StringGrid1.cells[0,a]:=x.Strings[b];
               StringGrid1.cells[1,a]:='1';
      end;
   end;
 x.Destroy;
StopZeit := Now;
StatusBar6.Panels[1].Text :='SuchZeit : '+ FormatDateTime('nn:ss:zzz', StopZeit - StartZeit) ;
Screen.Cursor := crDefault;
end;
Dieser Text dauert auf meinem langsamen Rechner ca. 17 sec. Ab markierter Stelle allein etwa 12-13 sec.
Der Rest der Zeit geht für das Sortieren drauf.

Zitat:

Zitat von alzaimar
Delphi-Quellcode:
MyList.Add(MyKeyString, MyData)

MyKeyString??
Was soll denn das sein? Immer wieder fällt mir Key mit der Add funktion auf aber wozu der Key da ist habe ich keine Ahnung


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:34 Uhr.
Seite 1 von 5  1 23     Letzte »    

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