Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Stringübergabe dauert sehr lange wer kann helfen ? (https://www.delphipraxis.net/58904-stringuebergabe-dauert-sehr-lange-wer-kann-helfen.html)

dorisdoloris 14. Dez 2005 13:52


Stringübergabe dauert sehr lange wer kann helfen ?
 
Hallo liebe Delphifreunde erst ein Problem gelöst und schon hab ich ein neues :(

Schaut euch mal den Code an in der ListBox sind 20000 Zeilen enthalten und die Übergabe dauert recht lange

Code:
for i := 0 to ListBox1.Items.Count -1 do
begin
    sNew := sNew + '' + Listbox1.Items.Strings[i];
    ProgressBar1.Position := i; // aktuelle Position
end;
lg: Doris

chaosben 14. Dez 2005 13:55

Re: Stringübergabe dauert sehr lange wer kann helfen ?
 
Anstatt dessen würde ich es so machen:
Delphi-Quellcode:
ListBox1.Items.Delimiter:='';
sNew:=ListBox1.Items.DelimitedText;

dorisdoloris 14. Dez 2005 14:00

Re: Stringübergabe dauert sehr lange wer kann helfen ?
 
"Delimiter" gibt es bei mir leider nicht ich benutze Delphi 5.0

Der_Unwissende 14. Dez 2005 14:15

Re: Stringübergabe dauert sehr lange wer kann helfen ?
 
Hi,
also erstmal dürfte es schon ziemlich viel Zeit kosten dein Progressbar so oft zu updaten. Ich weiß nicht wie intelligent diese Komponente ist, aber schau dir mal an, wie viel Zeit du sparst wenn du nur noch alle i mod 200 = 0 updatest, vorher verändert sich ja der eigentlich Wert nicht (hoffentlich nicht verrechnet, also alle Anzahl der Elemente / 100)

Ansonsten ist es glaube ich nicht so wirklich gut den Speicher für den String immer wieder neu zu allozieren, kostet auch wieder nur Zeit.
Vielleicht (bin mir nicht sicher), geht das ganze etwas schneller, wenn du hier vorab berechnest wie lang dein Zielstring wird, den Speicher schonmal allozierst und dann z.B. direkt Speicher kopierst (für jeden String).
Müsste man wohl mal testen

Gruß Der Unwissende

chaosben 14. Dez 2005 14:17

Re: Stringübergabe dauert sehr lange wer kann helfen ?
 
oder:
Delphi-Quellcode:
sNew:=StringReplace(ListBox1.Items.CommaText,',','',[rfReplaceAll]);

Der_Unwissende 14. Dez 2005 14:25

Re: Stringübergabe dauert sehr lange wer kann helfen ?
 
Also bei mir läuft ein kopieren (so wie du es hast) ganz ohne Progressbar in 0 Ticks, mit Aktualisierung alle 200 Schritte in 15 und mit Aktualisierung in jedem Schritt in ungefähr 675 Ticks.
Natürlich muss ich kurz dazu sagen, dass ich eine TStringList mit 20000 Einträgen verwende in die ich nur einen (immer gleichen) kurzen String gesteckt habe (also kommt schon viel von caching). Aber trotzdem zeigt sich zwischen den letzten beiden Fällen schon ein Faktor von knapp 50, allein durch das zu häufige Zeichnen der Progressbar. Denke dass du hier schon eine Menge mit rausholen kannst.

Gruß Der Unwissende

Daniel Schuhmann 14. Dez 2005 14:28

Re: Stringübergabe dauert sehr lange wer kann helfen ?
 
Liste der Anhänge anzeigen (Anzahl: 1)
Das Problem ist in der Tat die Progressbar. Wird sie nur jedes 100. Mal upgedatet, so ist das Ding fast sechs mal so schnell (891 ms zu 156 ms).

dorisdoloris 14. Dez 2005 15:35

Re: Stringübergabe dauert sehr lange wer kann helfen ?
 
Also ersteinmal ein Danke an alle für die Hilfe

Ich habe es nun mit der ProgressBar getestet und bin dabei zu folgenden Ergebnis gekommen

Delphi-Quellcode:
ProgressBar1.Position := i; // mit dieser Variante komm ich auf 29703 ms
If I mod 100 = 0 then ProgressBar1.StepBy(100);// mit dieser Variante komm ich auf 27297 ms

// und ohne ProgressBar komme ich auf 26504 ms

Also ich muss sagen das ist kein sehr großer Zeitgewinn. Ok jetzt werden einige sagen 2-3 sec sind gut aber ich dachte man könnte noch ein wenig mehr rausholen.


lg: Doris

Binärbaum 14. Dez 2005 16:04

Re: Stringübergabe dauert sehr lange wer kann helfen ?
 
Zitat:

Zitat von dorisdoloris
Delphi-Quellcode:
for i := 0 to ListBox1.Items.Count -1 do
begin
    sNew := sNew + '' + Listbox1.Items.Strings[i];
    ProgressBar1.Position := i; // aktuelle Position
end;

Eine Frage am Rande: steht da im Quelltext wirklich '' (=doppeltes Apostroph)? Das ist doch ein leerer String und der verändert doch nichts an einem String, wenn man diesem mit dem leeren String konkateniert (tolles Wort ;)). Also könnte man genauso folgendes Schreiben:
Delphi-Quellcode:
sNew := sNew + Listbox1.Items.Strings[i];
Ich glaube zwar kaum, dass man dadurch einen Geschwindigkeitszuwachs erzielt, aber schaden kann's ja nicht.

MfG
Binärbaum

@Daniel: Ich weiß nicht, was du meinst. :mrgreen: Nee nee, du hast natürlich recht.

Daniel Schuhmann 14. Dez 2005 16:08

Re: Stringübergabe dauert sehr lange wer kann helfen ?
 
Zitat:

Zitat von Binärbaum
Also könnte man genauso folgendes Schreiben:

Wenn Du eine Änderung vorschlägst, solltest Du auch den geänderten Code präsentieren :lol:

Ich vermute mal, gemeint war:
Delphi-Quellcode:
sNew := sNew + Listbox1.Items.Strings[i];


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:09 Uhr.
Seite 1 von 2  1 2      

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