![]() |
AW: Float in zwei Integer zerlegen
Zitat:
|
AW: Float in zwei Integer zerlegen
Als Index aber alles andere als optimal
|
AW: Float in zwei Integer zerlegen
Zitat:
Ansonsten hat sich die Diskussion imho etwas festgelaufen. Eine Lösung für das konkrete Problem (siehe Titel) wurde ja schon genannt und für das eigentliche Problem (die Performance) fehlen Informationen zu den Daten und der Anwendung. |
AW: Float in zwei Integer zerlegen
Wenn Du nicht vor hast mit den Daten irgendeine Operation durchzuführen, mach's über einen Typecast
Delphi-Quellcode:
Nur habe ich so meine Zweifel, daß das gut geht.
type
TTrenner=packed record t1,t2=integer; end; ... x.DTpart1:=ttrenner(MyValue).t1; x.DTpart2:=ttrenner(MyValue).t2; ... Gruß K-H |
AW: Float in zwei Integer zerlegen
Mal zurück zum Thema bzw. dem eigentlichen 'Sinn' der Frage.
1. Eine Liste mit +100k Werten enthält einen TDateTime-Wert. 2. Der Wert soll als Index bzw. Suchbegriff herhalten. 3. Beim speichern und wieder laden als JSON wird der TDateTime auf +/- 1 Sekunde gerundet. Wg. (3) würde ich dann a: JSON durch ein anderes Format ersetzen b: JSON Beibehalten, aber den Suchbegriff ändern Sagen wir mal, wir wollen JSON beibehalten. Dann könnte eine Lösung so aussehen: Jeder Record hat zusätzlich noch einen Wert 'ID', der erstens 4 Bytes lang ist und zweitens aus dem TDateTime gebildet werden kann. Dieser Wert muss ja nicht mit abgespeichert werden, solange er den +/- 1 Sekunde Fehler kompensieren kann. Ansonsten wird er eben mit abgespeichert. Oder wir sagen uns: "Blöd, JSON taugt hier eben nicht". Dann können wir die Daten trotzdem sehr einfach ablegen, denn ich kann so einen Record 1:1 (mit Einschränkungen, also kein 'String', sondern nur 'String[X]' etc.) direkt in einen Stream kopieren. Oder ich schreibe mir meinen Reader/Writer für so ein Record mal eben selbst. |
AW: Float in zwei Integer zerlegen
Es gibt noch eine andere Möglichkeit, auch wenn ich die Tauglichkeit mal offen lasse: TListItem ableiten und mit einem zusätzlichen TDateTime-Attribut ausstatten und die entstehende Klasse statt der TListItems benutzen.
MfG Dalai |
AW: Float in zwei Integer zerlegen
Oh natürlich, es gibt viele Wege, dieses Dilemma zu lösen. Ich wollte nur versuchen, die Erkenntnisse zusammenzufassen und dem Thread wieder eine Richtung zu geben.
|
AW: Float in zwei Integer zerlegen
Um ehrlich zu sein verstehe ich immer noch nicht das Problem des TE. Ich sortiere seit Jahren Listen, auch mit Daten und Zeiten, und hab keine Probleme. Das Problem ist weniger TDateTime als der Glaube es irgendwie machen zu müssen.
Hier ein Beispiel mit 10k Daten (also 100.000). Es werden Daten zufällig erzeugt und dann sortiert. Um diese Menge zu sortieren benötigt mein sechs Jahre alte Rechner 120 ms. Wo ist also das Problem?
Delphi-Quellcode:
uses
Contnrs, DateUtils; type TTest = class DateTime: TDateTime; end; var ol: TObjectList; procedure TForm1.Button1Click(Sender: TObject); const MsMax = 24 * 60 * 60 * 1000; var t: TTime; i: Integer; Test: TTest; function CompareDT(Item1, Item2: Pointer): Integer; begin Result := CompareDateTime(TTest(Item1).DateTime, TTest(Item2).DateTime); end; begin t := Now; ol.Clear; for i := 1 to 100000 do //10k Daten erzeugen begin Test := TTest.Create; Test.DateTime := Random(Trunc(Now)) + (Random(MsMax) / MsMax); //Zufälliges TDateTime ol.Add(Test); end; ol.Sort(@CompareDT); with ListView1 do begin OwnerData := True; ViewStyle := vsReport; //1 Column erstellen, breite 150 Pixel OwnerData := True; Items.Count := ol.Count; end; ShowMessage('Dauer: ' + IntToStr(MilliSecondsBetween(t, Now)) + 'ms'); end; procedure TForm1.ListView1Data(Sender: TObject; Item: TListItem); var Test: TTest; begin Test := TTest(ol.Items[Item.Index]); Item.Caption := FormatDateTime('dd.MM.yyyy hh:nn:ss', Test.DateTime); end; procedure TForm1.FormCreate(Sender: TObject); begin ol := TObjectList.Create; end; procedure TForm1.FormDestroy(Sender: TObject); begin ol.Free; end; |
AW: Float in zwei Integer zerlegen
10k sind 10.000 aber ansonsten hast Du Recht.
|
AW: Float in zwei Integer zerlegen
Yep, und gleich zwei mal den Fehler gemacht. In dem Fall werden die 10.000 Daten in 15 ms sortiert.
|
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