![]() |
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:
lg: Doris
for i := 0 to ListBox1.Items.Count -1 do
begin sNew := sNew + '' + Listbox1.Items.Strings[i]; ProgressBar1.Position := i; // aktuelle Position end; |
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; |
Re: Stringübergabe dauert sehr lange wer kann helfen ?
"Delimiter" gibt es bei mir leider nicht ich benutze Delphi 5.0
|
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 |
Re: Stringübergabe dauert sehr lange wer kann helfen ?
oder:
Delphi-Quellcode:
sNew:=StringReplace(ListBox1.Items.CommaText,',','',[rfReplaceAll]);
|
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 |
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).
|
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 |
Re: Stringübergabe dauert sehr lange wer kann helfen ?
Zitat:
Delphi-Quellcode:
Ich glaube zwar kaum, dass man dadurch einen Geschwindigkeitszuwachs erzielt, aber schaden kann's ja nicht.
sNew := sNew + Listbox1.Items.Strings[i];
MfG Binärbaum @Daniel: Ich weiß nicht, was du meinst. :mrgreen: Nee nee, du hast natürlich recht. |
Re: Stringübergabe dauert sehr lange wer kann helfen ?
Zitat:
Ich vermute mal, gemeint war:
Delphi-Quellcode:
sNew := sNew + Listbox1.Items.Strings[i];
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:40 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-2025 by Thomas Breitkreuz