AGB  ·  Datenschutz  ·  Impressum  







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

String to Array (schnell)

Ein Thema von xtZ · begonnen am 5. Sep 2007 · letzter Beitrag vom 6. Sep 2007
Antwort Antwort
xtZ

Registriert seit: 22. Jul 2007
21 Beiträge
 
#1

String to Array (schnell)

  Alt 5. Sep 2007, 21:13
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
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#2

Re: String to Array (schnell)

  Alt 5. Sep 2007, 21:14
Per .Text und StringReplace
Markus Kinzler
  Mit Zitat antworten Zitat
xtZ

Registriert seit: 22. Jul 2007
21 Beiträge
 
#3

Re: String to Array (schnell)

  Alt 5. Sep 2007, 21:15
Zitat von mkinzler:
Per .Text und StringReplace
Wie meinst du das? Hast evtl ein Bsp?
Thx
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#4

Re: String to Array (schnell)

  Alt 5. Sep 2007, 21:17
Es gibt ja die Möglichkeit den gesammten Inhalt einer Stringliste in einen String auslagern.
Markus Kinzler
  Mit Zitat antworten Zitat
xtZ

Registriert seit: 22. Jul 2007
21 Beiträge
 
#5

Re: String to Array (schnell)

  Alt 5. Sep 2007, 21:23
Zitat von mkinzler:
Es gibt ja die Möglichkeit den gesammten Inhalt einer Stringliste in einen String auszulagern.
Brauch es am Ende aber alles in einem Array. Und was soll ich replacen?
  Mit Zitat antworten Zitat
MStoll

Registriert seit: 15. Nov 2005
131 Beiträge
 
Turbo Delphi für Win32
 
#6

Re: String to Array (schnell)

  Alt 5. Sep 2007, 23:10
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]
"Man soll nie mehr essen als mit Gewalt reingeht!" (n.n.)
  Mit Zitat antworten Zitat
xtZ

Registriert seit: 22. Jul 2007
21 Beiträge
 
#7

Re: String to Array (schnell)

  Alt 5. Sep 2007, 23:18
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.

THX
  Mit Zitat antworten Zitat
MStoll

Registriert seit: 15. Nov 2005
131 Beiträge
 
Turbo Delphi für Win32
 
#8

Re: String to Array (schnell)

  Alt 6. Sep 2007, 00:43
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;
"Man soll nie mehr essen als mit Gewalt reingeht!" (n.n.)
  Mit Zitat antworten Zitat
xtZ

Registriert seit: 22. Jul 2007
21 Beiträge
 
#9

Re: String to Array (schnell)

  Alt 6. Sep 2007, 01:25
Vielen Dank MStoll, deine Funktion funktioniert sehr gut und auch relativ schnell. Hast mich gerettet.
  Mit Zitat antworten Zitat
Antwort Antwort


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 04:17 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