Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi String to Array (schnell) (https://www.delphipraxis.net/99034-string-array-schnell.html)

xtZ 5. Sep 2007 22:13


String to Array (schnell)
 
Hi,

Welches ist die schnellste Methode einen großen String (aus der RichEdit) in ein String-Array zu bekommen?

Habe vieles ausprobiert und die schnellste, aber auch umständlichste Methode, war die RichEdit in eine Textdatei zu speichern, die Datei zeilenweise (mit ReadLn) einzulesen und die Zeilen in das Array zu legen.

Explode/Split ist viel zu langsam und das zeilenweise auslesen aus der RichEdit auch.

Kennt jemand was schnelleres (weniger umständlicheres)? evtl. mit ASM oder so?

Danke

mkinzler 5. Sep 2007 22:14

Re: String to Array (schnell)
 
Per .Text und StringReplace

xtZ 5. Sep 2007 22:15

Re: String to Array (schnell)
 
Zitat:

Zitat von mkinzler
Per .Text und StringReplace

Wie meinst du das? Hast evtl ein Bsp?
Thx

mkinzler 5. Sep 2007 22:17

Re: String to Array (schnell)
 
Es gibt ja die Möglichkeit den gesammten Inhalt einer Stringliste in einen String auslagern.

xtZ 5. Sep 2007 22:23

Re: String to Array (schnell)
 
Zitat:

Zitat von mkinzler
Es gibt ja die Möglichkeit den gesammten Inhalt einer Stringliste in einen String auszulagern.

:wiejetzt: Brauch es am Ende aber alles in einem Array. Und was soll ich replacen?

MStoll 6. Sep 2007 00:10

Re: String to Array (schnell)
 
hi,

warum ist explode viel zu langsam? Wie hast du's denn implementiert?
Ich benutze zum Zerlegen von z.B. großen CSV-Dateien auch explode (und das ist sicher die einfachste Variante, einen String zu zerlegen). Wenn du möchtest, kann ich dir gerne meine Implementierung geben.

Gruß
Michael

[Edit]Auch Assembler nützt einem nix, wenn der verwendete Algorithmus nicht der beste ist. Ich habe auch irgendwo (möglicherweise hier in der Code-Library, bin mir nicht mehr sicher) mal so einen explode-Algo in Assembler gesehen. Trotzdem war meine Variante in reinem Delphi bei 7MB Daten ca. 10.000x schneller.[/Edit]

xtZ 6. Sep 2007 00:18

Re: String to Array (schnell)
 
Zitat:

Zitat von MStoll
hi,

warum ist explode viel zu langsam? Wie hast du's denn implementiert?
Ich benutze zum Zerlegen von z.B. großen CSV-Dateien auch explode (und das ist sicher die einfachste Variante, einen String zu zerlegen). Wenn du möchtest, kann ich dir gerne meine Implementierung geben.

Gruß
Michael

Hi,

Ich habe sämtliche Implementierungen aus diesem und anderen Foren ausprobiert und sogar eine aus 100% Inline-ASM, aber die sind alle viel langsamer, als das abspeichern und auslesen aus einer Datei. Aber es wäre nett, wenn du mal deine Implementierung postest, vielleicht läuft die ja. :stupid:

THX

MStoll 6. Sep 2007 01:43

Re: String to Array (schnell)
 
Ok, falls du diese optimierte Variante schon probiert hast, dann kann ich dein Problem verstehen. Diese Variante hab ich auch grad eben erst gesehen und probiert, aber die ist schon sauschnell...

Meine ist je nach Delimiter 2-4x so langsam (laut Testtool). Aber wie versprochen, kannst du meine ja mal ausprobieren:

Delphi-Quellcode:
function follows(const s,n : string; pos1 : integer) : boolean;
var x : integer;
begin
     for x := 0 to length(n)-1 do
         if n[x+1] <> s[pos1 + x] then
         begin
              result := false;
              exit;
         end;
         
     result := true;
end;

function explode(const n,s : string) : TStringDynArray;
var temp : array of integer;
    Len : integer;
    x, count, laenge : integer;
begin
     x := 1;
     SetLength(temp, 20);
     count  := 1;
     temp[0] := 1;

     laenge := Length(s) - Length(n) + 1;

     while x <= laenge do
     begin
          if follows(s,n,x) then
          begin
               inc(x, length(n));
               inc(count);
               if length(temp) < count then
                  SetLength(temp, count + 20);
               temp[count-1] := x;
               continue;
          end;
          inc(x);
     end;
     SetLength(temp, count);

     SetLength(result, length(temp));
     for x := 0 to High(temp)-1 do
     begin
          Len := temp[x+1]-temp[x]-length(n);

          result[x] := copy(s, temp[x], Len);
     end;

     Len := length(s)-temp[high(temp)]+1;
     result[high(temp)] := copy(s, temp[high(temp)], Len);
end;

xtZ 6. Sep 2007 02:25

Re: String to Array (schnell)
 
Vielen Dank MStoll, deine Funktion funktioniert sehr gut und auch relativ schnell. Hast mich gerettet. :thumb:


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:57 Uhr.

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