Delphi-PRAXiS
Seite 4 von 7   « Erste     234 56     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   String in TStringList finden verschnellern? (https://www.delphipraxis.net/191366-string-tstringlist-finden-verschnellern.html)

a.def 8. Jan 2017 18:33

AW: String in TStringList finden verschnellern?
 
Das gibt einem zu denken. Danke für die ausführliche Erklärung!

Eine Frage habe ich noch. Wenn man sorted auf True setzt, ist das hinzufügen zur Liste deutlich langsamer und Einträge die schon vorhanden sind werden ignoriert.
Spielt es eine Rolle, ob ich Sorted vor oder nach dem Hinzufügen all meiner Einträge auf True setze?

Fritzew 8. Jan 2017 18:43

AW: String in TStringList finden verschnellern?
 
Also:


Delphi-Quellcode:
sl := Tstringlist.create;
sl.Duplicates = dupAccept; // Damit Duplicate erlaubt sind
// Alles einfügen

// dann
sl.sorted := true; // Sortiert die Liste
so sollte es gehen

nahpets 8. Jan 2017 18:47

AW: String in TStringList finden verschnellern?
 
Wenn Sorted = true muss beim Einfügen geschaut werden, wo der neue Eintrag hin muss, damit er dort eingefügt werden kann.

Statt Sorted = true könntest Du mal probieren, ob der Aufruf von Sort vor der Stelle, ab der Du suchen willst, etwas bringt. Du muss dann aber an der Stelle mit etwas Wartezeit rechnen.

Man kann für den Fall dann auch eine eigene Sortierroutine zuweisen, die eventuell auch das Laufzeitverhalten ändern könnte.

a.def 8. Jan 2017 19:34

AW: String in TStringList finden verschnellern?
 
Habe es nun testen können. Funktioniert einwandfrei, Sort; erst später aufzurufen und Sorted zu setzen (habe einfach beides gemacht).
Die Wartezeit für das "manuelle Sortieren" der Liste im Nachhinein mit dem Aufruf durch Sort; oder dem Setzen von Sorted := True ist sehr viel kürzer als die die entsteht, wenn man es bereits vorher so einstellt.

Uwe Raabe 8. Jan 2017 21:41

AW: String in TStringList finden verschnellern?
 
Zitat:

Zitat von a.def (Beitrag 1358417)
Habe es nun testen können. Funktioniert einwandfrei, Sort; erst später aufzurufen und Sorted zu setzen (habe einfach beides gemacht).
Die Wartezeit für das "manuelle Sortieren" der Liste im Nachhinein mit dem Aufruf durch Sort; oder dem Setzen von Sorted := True ist sehr viel kürzer als die die entsteht, wenn man es bereits vorher so einstellt.

Delphi-Quellcode:
Sorted := true
ruft intern sowieso ein
Delphi-Quellcode:
Sort
auf, das nun aber nichts mehr verändert. Probier mal, ob es noch etwas schneller ist, wenn du den expliziten
Delphi-Quellcode:
Sort
-Aufruf weglässt.

a.def 8. Jan 2017 21:51

AW: String in TStringList finden verschnellern?
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1358421)
Zitat:

Zitat von a.def (Beitrag 1358417)
Habe es nun testen können. Funktioniert einwandfrei, Sort; erst später aufzurufen und Sorted zu setzen (habe einfach beides gemacht).
Die Wartezeit für das "manuelle Sortieren" der Liste im Nachhinein mit dem Aufruf durch Sort; oder dem Setzen von Sorted := True ist sehr viel kürzer als die die entsteht, wenn man es bereits vorher so einstellt.

Delphi-Quellcode:
Sorted := true
ruft intern sowieso ein
Delphi-Quellcode:
Sort
auf, das nun aber nichts mehr verändert. Probier mal, ob es noch etwas schneller ist, wenn du den expliziten
Delphi-Quellcode:
Sort
-Aufruf weglässt.

Gute Information.
Ich hatte extra noch den STRG+Linksklick auf .Sorted gemacht um danach zu suchen. Bin aber erst daran gescheitert es zu finden.
Bis
Delphi-Quellcode:
procedure TStringList.SetSorted(Value: Boolean);
bin ich gekommen und habe dort dann diese wunderschöne Zeile
Delphi-Quellcode:
if Value then Sort;
übersehen.

Ich werde das später mal mit der TStopWatch prüfen.

EmWieMichael 9. Jan 2017 07:40

AW: String in TStringList finden verschnellern?
 
Zitat:

Zitat von himitsu (Beitrag 1358378)
Rein "logisch" nur eine mathematische Rechnung.
Delphi-Quellcode:
V = A - B
(gleich 0, kleiner 0, größer 0)
Delphi-Referenz durchsuchenCompareValue
Dann weiß man sofort ob größer, kleiner oder gleich.
...

Wahrscheinlich steh´ ich wirklich auf´m Schlauch :shock:: Ich habe jetzt eine Rechnung aufgestellt und das Ergebnis steht in 'V'; ich weiß, dass 'V' kleiner 0, größer 0 oder gleich 0 ist. Um auf dieses Ergebnis zu reagieren, benötige ich doch immer noch zwei Vergleiche:
Code:
...
if (V = 0) then
 begin
   Gefunden;
   Break;
 end;
if (V < 0) then
 SuchindexNachUnten;
else
 SuchindexNachOben;
...

Klaus01 9. Jan 2017 09:08

AW: String in TStringList finden verschnellern?
 
oder so:

Delphi-Quellcode:
case v of
  low(Integer) .. -1: SuchIndexNachUnten;
  0: Gefunden;
  1 .. high(Integer): SuchIndexNachOben;
end;
Grüße
Klaus

EmWieMichael 9. Jan 2017 09:14

AW: String in TStringList finden verschnellern?
 
Zitat:

Zitat von Klaus01 (Beitrag 1358440)
oder so:
Delphi-Quellcode:
case v of
  low(Integer) .. -1: SuchIndexNachUnten;
  0: Gefunden;
  1 .. high(Integer): SuchIndexNachOben;
end;

Richtig, geht auch; allerdings dürfte diese Variante (wenigstens theoretisch) langsamer sein.

p80286 9. Jan 2017 11:17

AW: String in TStringList finden verschnellern?
 
@a.def
wenn du mit
Delphi-Quellcode:
.sorted:=True;
arbeitest, dann mußt Du noch eine Behandlung von doppelten Datensätzen mit einbauen z.B.
Delphi-Quellcode:
.Duplicates:=dupIgnore;
Gruß
K-H


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:41 Uhr.
Seite 4 von 7   « Erste     234 56     Letzte »    

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