![]() |
AW: Float in zwei Integer zerlegen
Zitat:
|
AW: Float in zwei Integer zerlegen
Ich dachte ich kann mich bei einem dymanischen Array nicht darauf verlassen wegen Inserts, Deletes etc.
|
AW: Float in zwei Integer zerlegen
In der letzten Zeit bin ich ein Fan von virtuellen Listen, sowohl bei ListBoxen, wie auch bei ListViews. Verwaltet werden die Daten in einer ObjectList und lediglich angezeigt in ListView. Der Vorteil, dadurch wird das Ganze viel schneller. Der Grund - hier muss ListView nicht die ganzen Daten schleppen, die bleiben in der ObjectList. ListView ist nur noch für die Anzeige der paar Items die gerade sichtbar sind:
Delphi-Quellcode:
Um das Beispiel umzusetzen reicht ein ListView auf dem Formular.
uses
Contnrs; type TTest = class Num: Integer; DateTime: TDateTime; end; var ol: TObjectList; procedure TForm1.FormCreate(Sender: TObject); var d: Integer; Test: TTest; Col: TListColumn; begin //Hier eine ObjectList Liste erstellen ol := TObjectList.Create(True); //Hier die Liste mit Daten füllen for d := Trunc(Now) - 365 to Trunc(Now) do begin Test := TTest.Create; Test.Num := Random(1000); Test.DateTime := d + Now; ol.Add(Test); end; with ListView1 do begin ViewStyle := vsReport; Col := Columns.Add; //Beschriftungen Col.Caption := 'Num'; Col := Columns.Add; Col.Caption := 'Date'; Col.Width := 150; OwnerData := True; Items.Count := ol.Count; end; end; procedure TForm1.FormDestroy(Sender: TObject); begin ol.Free; end; procedure TForm1.ListView1Data(Sender: TObject; Item: TListItem); var Test: TTest; begin Test := TTest(ol[Item.Index]); //hier werden die Daten aus ObjectList an ListView übertragen Item.Caption := IntToStr(Test.Num); Item.SubItems.Add(DateTimeToStr(Test.DateTime)); end; |
AW: Float in zwei Integer zerlegen
Zitat:
Dann nimm halt das nächstbeste: Der Index in das Array (auf Pointer gecastet). |
AW: Float in zwei Integer zerlegen
@Popov
Hatte zuerst TList, aber nach einem Tipp auf TDynArray umgestellt und jede Operation (Insert, Delete, Move, Copy von Teilbereichen) ist 30-300% schneller. @Bug Ich kann eben den Index (also array[x]) nicht speichern, weil dieser sich ständig ändert. Ein Delete oder Insert und der Index zeigt schon auf einen anderen Record. Ich muss also das TDateTime speichern und wenn ich von ListView -> Array gehen will eine Suche machen. |
AW: Float in zwei Integer zerlegen
Zitat:
Aber entweder ich verstehe nicht was du machst oder du verstehst nicht was ich vorhin gepostet habe. Ich hab letztens ein Beispiel hier im Forum erstellt das 13.000 Dateiennamen von der Festplatte, inkl. Größe und Datum und alphabetischen Sortierung, in 15 ms in die Liste einliest und sie in einer ListView darstellt. Du hast 1.000 Werte. Willst du mit mir also über eine 1/2 Millisekunde diskutieren? |
AW: Float in zwei Integer zerlegen
Ich hab 100.000 Werte (wie mehrmals geschrieben) und es werden mehr. Diese werden mit anderen Arrays abgeglichen, es wird nach Duplikaten gesucht etc. Manche Operationen dauern dann 2-3 Sekunden und wenn ich bei der Umstellung von TList auf TDynArray 1 Sekunde gewinne ist es großartig.
|
AW: Float in zwei Integer zerlegen
Ich rieche Optimierung an der falschen Stelle.
Wenn bei 100k Elementen bestimmte Operationen 2-3 Sekunden dauern, dann liegt das ganz sicher daran, dass ein falscher Algorithmus benutzt wird (beim Suchen z.B. vermute ich eine lineare Suche) - außerdem kommen bei Records noch andere mögliche Performance hits hinzu (z.B. durch mangelndes const bei Parameterübergabe haufenweise CopyRecord). Wie sind wir nochmal vom Zerlegen eines Floats in 2 Integer hierher gekommen? :shock: |
AW: Float in zwei Integer zerlegen
Es ist viel Suche nach Duplikaten dabei, wenn neue Daten ankommen, da kann ich nicht viel optimieren, weil ich schon eine Hashtable für die Stringwerte verwende. Die Inserts und Deletes sind sowohl bei TList als auch bei dynamischen Arrays extremst kostspielig. Deshalb dachte ich über eine linked List oder ein Binary Tree nach, aber dann renne ich in andere Nachteile.
|
AW: Float in zwei Integer zerlegen
Wer Interesse an TDynArray hat, kann ich wärmstens empfehlen:
![]() ![]() |
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:48 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 by Thomas Breitkreuz