Einzelnen Beitrag anzeigen

Benutzerbild von stoxx
stoxx

Registriert seit: 13. Aug 2003
1.111 Beiträge
 
#44

Re: [Optimiert] Explode Prozedur - Reloaded (Ersatz für Code

  Alt 25. Feb 2008, 15:08
Bei einem einstelligen Trennzeichen (z.B. ';') ergeben sich Performancesteigerungen (MB/s) von 10-150% (die 150% natürlich bei extrem langen Strings),
100 chars per line: 1000000 lines in 2907 tics, 343997 lines per sec, 33,6 mb/s (del = ";")

das kann man mal als Referenz für den meinen Rechner nehmen.
Es stimmt, mit Fastcode erreicht man steigerungen in dem Bereich um ungefähr 100 Prozent.
Ich bin aber nun schon bei ca. um die 80 - 90 MB/s,
Wenn man nicht alle Spalten der CSV Datei benötigt, sogar auf 115 MB.
Das langsame sind nämlich die Stringkopien.
Ich habe es mit einem Pointerarray gelöst,das gespeichert wird, und erst beim Get_Zugriff auf den Index, wird der String mit SetString() kopiert.

Zitat:
Wenn man aber an dem Teil feilen will, dann sollte man ein dynamisches StringArray befüllen.
am besten gar nix befüllen nur wenn es gebraucht wird, da würdest Du ja nochmal einen String kopieren, das ist ja das lahme, eine reine PChar verwendung wäre die Lösung. die Fastcode Lösungen haben alle generell den Nachteil, dass sie nur reine Strings annehmen ....
Vielleicht bastel ich mir auch nochmal einen reinen PChar Textreader, dann gänge es sogar noch schneller
Dann entfällt NOCH einmal umkopieren. (100 Prozent Performance mehr)

Zitat:
Eventuell bring es was die TStringDivider-Klasse so umschreiben, das beim Explode gar keine Stringlisten erzeugt werden, sondern nur die Positionen der einzelnen Substrings im Text
so hab ichs gemacht ...

Zitat:
aber nicht schlecht 100MB mit nur 1500 MS zu durchsuchen, Komplett ? also von vorne bis hinten ?
ja, sollte kein Problem sein, die meisten nehmen nur keinen Lesepuffer zum lesen.
(Faktor 10 - 20 langsamer)

schau mal hier, die Rohdaten zu lesen, hast Du ungefähr in 750 ms gemacht ( 100 MB)

http://delphi.pjh2.de/articles/files/files.php


Zitat:
Und ich dachte immer ASM sei so schnell.....
du hast den falschen Schluss gezogen ....
ASM ist genauso schnell wie Delphi. wenn es gut compiliert.
Die Fastcode Lösungen sind oft trickreiche Sachen, man arbeitet mit ASM aber noch mit anderen Ideen.
Sprungadressen auf Funktionen anhand der Übergabeparameter berechnen usw.
Musst Du dir mal ansehen, reines Assember ist auch nicht schneller.

Das langsame sind die Strings ... einmal Setstring aus dem String heraus in einen Tempbuffer, .. und dann noch einmal!! in TStrings hinein.

schau Dir mal die procedure TStrings.SetTextStr(const Value: string); in SysUtils an ...

die fast function StrPosJOH wäre wahrscheinlich noch interessant, um die Position zu finden. dürfte Schneller sein, als die Schleife:

http://coding.derkeiler.com/Archive/.../msg00102.html

und dann in Assembler, aber da ist wohl ein Uppercase drin ....

http://coding.derkeiler.com/Archive/.../msg00057.html

hab ich aber noch nicht eingebaut
Phantasie ist etwas, was sich manche Leute gar nicht vorstellen können.
  Mit Zitat antworten Zitat