Schnelles suchen in einfach verketeter Liste

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Benutzeravatar
theo
Beiträge: 10497
Registriert: Mo 11. Sep 2006, 19:01

Beitrag von theo »

pluto hat geschrieben:Ich habe sie wie gesagt einmal verwendet und auf meinem Rechner war es einfach zu langsam.


Wie lange hat denn der obige Code bei dir?

pluto
Lazarusforum e. V.
Beiträge: 7178
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Beitrag von pluto »

werde ich später mal testen. Mal schauen.
MFG
Michael Springwald

Christian
Beiträge: 6079
Registriert: Do 21. Sep 2006, 07:51
OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
CPU-Target: AVR,ARM,x86(-64)
Wohnort: Dessau
Kontaktdaten:

Beitrag von Christian »

Du könntest also deinen Suchstring inklusive TObject via AddObject in die Stringlist schreiben. Das wäre dann ziemlich einfach Wink


Schöne idee, muss mal sehn ob mit der Zeitvorteil gegenüber der Unsauberkeit der Lösung wichtiger ist ;)

@Pluto, du musst TList nicht einsetzen, das sie schneller ist ist aber unbestreitbar. Du kannst auch nicht sagen die Erde ist flach. Das ist einfach erwiesenermaßen nicht so. Werd doch Politiker ;)
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

pluto
Lazarusforum e. V.
Beiträge: 7178
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Beitrag von pluto »

Ihr habt natürlich recht. Wie kann ich nur ?
Wenn es darum geht 1000 Elemente auf einen Schlag hinzuzufügen dann ja.

Aber nicht wenn ich wie in meinem Fall ein Object hinzufügen und dann wieder ein Object hinzufügen. Da ist meiner meinung nach eine Doppelt Verkette Liste einfach die bessere Wahl.

Ich frage mich auch wie kann die TList speicher im voraus berechnen ?
Wo sie doch gar nicht weiß wie viele Elemente hinzugefügt werden sollen !

Aber lassen wir das ok ?
Ihr seit für die TList ich bin für meine "Doppelt Verkette Liste"

Wobei ich wollte auch die CPU-Leistung auch nicht auf 100% Bringen beim hinzufügen von nur einen Object. Das kommt noch dazu !
MFG
Michael Springwald

Benutzeravatar
theo
Beiträge: 10497
Registriert: Mo 11. Sep 2006, 19:01

Beitrag von theo »

pluto hat geschrieben:Ich frage mich auch wie kann die TList speicher im voraus berechnen ?
Wo sie doch gar nicht weiß wie viele Elemente hinzugefügt werden sollen !

Aber lassen wir das ok ?


TList reserviert auf Vorrat, abhängig von der aktuellen Capacity.
Steht alles in den Sourcen.
Aber du willst ja eh nichts hören. Ich hab bald auch keine Lust mehr dir zu antworten.

pluto
Lazarusforum e. V.
Beiträge: 7178
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Beitrag von pluto »

ach so.... ich glaube dir/euch ja.... aber meine versuche vor einigen Monaten mit der TList haben mir was anders gesagt !
Evlt. finde ich sie noch mal wieder. Dann könnt ihr euch davon überzeugen !
oder ich erstelle sie einfach neu. Soviel Aufwand war das ja zum glück nicht !
MFG
Michael Springwald

Christian
Beiträge: 6079
Registriert: Do 21. Sep 2006, 07:51
OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
CPU-Target: AVR,ARM,x86(-64)
Wohnort: Dessau
Kontaktdaten:

Beitrag von Christian »

Pluto, wir haben selbst schon oft mit TList gearbeitet und zumindest für meinen Teil geht das über ein paar tausend Einräge hinaus. Das Hinzufügen von einem Eintrag ist fast nicht wahrnehmbar.
TList ist die Mutter aller Listen in Pascal und ich denke weiter optimiert geht es nicht gross. Ich weiß nicht wie du es vergewaltigt hast um es langsam zu bekommen aber es interessiert mich auch nicht.
Wenn du natürlich Theo oder jemand anders der mitliest noch 20x mitteilen möchtest das es bei dir langsam ist tu das bitte.
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

pluto
Lazarusforum e. V.
Beiträge: 7178
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Beitrag von pluto »

endlich bin ich soweit meine Testlist umfasst 43190 Einträge.

Jetzt füge ich an einer bestimmten Stelle 1 Objekt ein.
ich verende jetzt eine tlist.

Problem ist, ich kann mit den ausgaben von:
Caption:=inttostr(GetTickCount-Tick);
nix anfangen.
Sind dabei nur die ersten stellen wichtig ?

Morgen werde ich das gleiche Projekt mit meiner "Doppelt Verketten Liste" machen *G*
mal sehen. dann wird es sich zeigen wer recht hat. Aber ich glaube es liegt am zeichnen. Da ich ja immer alles neuzeichnen muss bei einem Tastendruck.. mal sehen !
und bei der Ausgabe steht auch ein - Zeichen davor
MFG
Michael Springwald

Benutzeravatar
theo
Beiträge: 10497
Registriert: Mo 11. Sep 2006, 19:01

Beitrag von theo »

Du musst den Tickcount vor der Messung natürlich erst speichern.
Nach dem zu messenden Teil musst du die Differenz ausgeben:

Tick:=GetTickCount;
//Hier der Code dessen Geschw. gemessen werden soll.
Caption:=inttostr(GetTickCount-Tick);

Hier handelt es sich um Millisekunden. Das ist für eine Einzelmessung wahrscheinlich zu ungenau (da wirst du wahrscheinlich 0 bekommen).

Deshalb habe ich das ja auch 20000 mal gemacht bei meinem Beispiel.
Da füllt sich die Liste auf 40000 Elemente wobei immer der ganze Kram weiter geschoben wird, da ich bei 0 einfüge (schlimmster Fall).

Dabei komme ich auf 700ms für 20000 Vorgänge. Das macht pro Insert 0.035 Millisekunden.
Das hat sowas von gar nichts mit deinen 10 Sekunden zu tun, dass dein Problem nicht bei TList liegen kann.
Zuletzt geändert von theo am Do 9. Aug 2007, 23:42, insgesamt 1-mal geändert.

pluto
Lazarusforum e. V.
Beiträge: 7178
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Beitrag von pluto »

Gut ! Ich glaube ich euch ! ich sehe es ein.

Ich habe heute gemerkt das es vermutlich am Zeichnen liegt. weil das muss ja auch immer wieder neu gezeichnet werden.

Ich schlage vor, wir löschen dieses Thema einfach wieder ich glaube Christian hat seine Antwort und gut ist.

Ich für mein Teil werde noch mal einige Tests machen, da ich ja jetzt ein passendes Programm geschrieben habe und dann kann ich euch das Ergebnis mitteln.

Der den Test wollte ich so machen:
Wenn ich ein Object einfügen(Was bei mir beim Tippen Passiert).
ich merke mir vor der Messung mit GetTickCount die Zeit !
Nach dem einfügen ermittele ich dann die dauer.

danach das gleich mit dem Zeichnen. Das heißt, ich füge ein Object ein zeichne danach Direkt und vergleiche dann erst die zeiten.

Das gleiche mache ich mit meiner "Doppelt Verketten Liste".
MFG
Michael Springwald

Benutzeravatar
theo
Beiträge: 10497
Registriert: Mo 11. Sep 2006, 19:01

Beitrag von theo »

pluto hat geschrieben:
Ich schlage vor, wir löschen dieses Thema einfach wieder ich glaube Christian hat seine Antwort und gut ist.



Wieso löschen? Was soll das denn jetzt?

pluto
Lazarusforum e. V.
Beiträge: 7178
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Beitrag von pluto »

weil alle die die Beiträge nix bringen darum !

Dann halt nur beine Beiträge hier in diesem Thread ! weil die führten ja zu nix !
MFG
Michael Springwald

Benutzeravatar
theo
Beiträge: 10497
Registriert: Mo 11. Sep 2006, 19:01

Beitrag von theo »

DIR bringen sie nichts, weil du sowieso nichts hören willst was dir nicht in den Kram passt. Darum sagte ich auch, dass ich bald keine Lust mehr habe, dir zu Antworten.
Ich finde diesen Thread gar nicht nutzlos.
Die Frage ob und wann verkettete Listen einen Vorteil gegenüber Array und TList bringen ist doch absolut berechtigt.

pluto
Lazarusforum e. V.
Beiträge: 7178
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Beitrag von pluto »

Bitte, wenn du das so siehst !
MFG
Michael Springwald

Antworten