-
Forum: Object-Pascal / Delphi-Language
Delphi
by Shark99,
20. Jun 2015
Ja ich merke gerade Indexierung nach TDateTime war keine gute Idee. Ich kann so zwar einen bestimmten Tag blitzartig finden (der Array ist sortiert), aber abspeichern des TDateTime in einen JSON mit FloatToStr() und das Parsen um es zu laden führt zur Verfälschung der Daten (zwar Unterhalb einer Sekunde, aber ich finde damit die Duplikate nicht mehr 100% zuverlässig). Vielleicht sollte ich...
-
Forum: Object-Pascal / Delphi-Language
Delphi
by Shark99,
20. Jun 2015
So einfach ist das nicht; ich nutze schon viele Sachen des TDynArrays, die ich sonst ersetzen müsste durch andere Komponenten, z.b. SaveToStream() um ein UTF8 JSON zu erzeugen. Mit der Performance bin auch schon sehr zufrieden, ist alles gut doppelt so schnell geworden wie die ursprüngliche TList Geschichte.
Hab eben bemerkt dass ich TDateTime -> string und zurück Convertions auch unbedingt...
-
Forum: Object-Pascal / Delphi-Language
Delphi
by Shark99,
20. Jun 2015
Es geht darum dass ich einen Eintrag aus dem Listview wieder in meinem TDynArray finden will.
Als ich noch TList verwendete war es einfach. Hab in TListItem.Data den Pointer zu einem TList Objekt gespeichert und das wars.
Mit dem dynamischen Array kann ich keinen Pointer nehmen. Also muss ich den Array durchsuchen.
Ein Record besteht aus einem TDateTime (als Index) und einem string. Der...
-
Forum: Object-Pascal / Delphi-Language
Delphi
by Shark99,
20. Jun 2015
Eben, es gibt Rundungsfehler und ich finde den Record nicht wieder.
-
Forum: Object-Pascal / Delphi-Language
Delphi
by Shark99,
20. Jun 2015
Mal zum Ursprungsthema.
Irgendwas ist faul. Aus einem TDateTime von 42173,681694 wird durch Trunc(Frac(DateTime) * 24 * 60 * 60 * 1000) ein Integer von 58898345. Werde es wohl doch in einen String speichern müssen damit ich es wieder finde.
-
Forum: Object-Pascal / Delphi-Language
Delphi
by Shark99,
19. Jun 2015
Wer Interesse an TDynArray hat, kann ich wärmstens empfehlen:
http://synopse.info/forum/viewtopic.php?id=254
http://synopse.info/files/mORMotNightlyBuild.zip
-
Forum: Object-Pascal / Delphi-Language
Delphi
by Shark99,
19. Jun 2015
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.
-
Forum: Object-Pascal / Delphi-Language
Delphi
by Shark99,
19. Jun 2015
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.
-
Forum: Object-Pascal / Delphi-Language
Delphi
by Shark99,
19. Jun 2015
@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) 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...
-
Forum: Object-Pascal / Delphi-Language
Delphi
by Shark99,
19. Jun 2015
Ich dachte ich kann mich bei einem dymanischen Array nicht darauf verlassen wegen Inserts, Deletes etc.
-
Forum: Object-Pascal / Delphi-Language
Delphi
by Shark99,
19. Jun 2015
Weil das Array aus Records und nicht aus Objekten besteht.
-
Forum: Object-Pascal / Delphi-Language
Delphi
by Shark99,
19. Jun 2015
Im Prinzip war alles langsamer. Verwende TDynArray, welche in Gegensatz zu TList sehr optimiert ist.
-
Forum: Object-Pascal / Delphi-Language
Delphi
by Shark99,
19. Jun 2015
Es wäre einfacher, aber hab derzeit 100k Datensätze und es können mehr werden. Habs mit TList und Objekten getestet. War etwa 2-3 mal langsamer.
-
Forum: Object-Pascal / Delphi-Language
Delphi
by Shark99,
19. Jun 2015
Wie ich schrieb, ein dynamisches Array von Records, im Record selbst ist TDateTime (index) und ein string.
-
Forum: Object-Pascal / Delphi-Language
Delphi
by Shark99,
19. Jun 2015
Ein String ist ein 4 Byte Pointer und passt somit in einen "normalen" Pointer. Ein Double hat 8 Bytes.
-
Forum: Object-Pascal / Delphi-Language
Delphi
by Shark99,
19. Jun 2015
Ich habe ein dynamisches Array mit etwa 100k records. In einem Listview werden max 1000 davon angezeigt.
Meine Befürchtung ist eben dass ein TDateTime, also ein double 8 Bytes belegt, wenn ich das in einen 4 Byte Pointer reinquetsche können Daten verloren gehen.
-
Forum: Object-Pascal / Delphi-Language
Delphi
by Shark99,
19. Jun 2015
@Dalai
Ich habe angenommen dass unter 32Bit ein Pointer aus 4 Bytes besteht und der Platz nicht ausreicht um eine Gleitkommazahl darin abzuspeichern. Es wäre Klasse wenn ich TDateTime direkt in .Data reinpressen kann. Hab aber wie gesagt Bedenken.
@Popov
Danke!
-
Forum: Object-Pascal / Delphi-Language
Delphi
by Shark99,
19. Jun 2015
Das war meine erste Idee, aber dazu muss ich mit Objekten rumhantieren, Speicher allozieren etc. Es kostet Performance die hier sehr wichtig ist. Ich dachte ich zerlege TDateTime in zwei Integer und speichere sie im ImageIndex (Vorkomma) und OverlayIndex (die im Listview nicht verwendet werden).
-
Forum: Object-Pascal / Delphi-Language
Delphi
by Shark99,
19. Jun 2015
Ich kann die Zeit nicht in dem Listview (Items) direkt speichern, weil der User sie nicht sehen sollte.
Ich habe Daten in einem dynamischen Array (muss sehr performant sein, TList kommt nicht in Frage). Ich zeige dann Daten daraus in einem Listview. Der Array ist nach Zeit indiziert (ohne Duplikate) und ich muss ein TDateTime in das Listview irgendwie reinquetschen um schnell ein Listview Item...
-
Forum: Object-Pascal / Delphi-Language
Delphi
by Shark99,
19. Jun 2015
Ich möchte eine Gleitzahl in zwei Integer zerlegen.
Vorkomma und Nachkomma sollen jeweils zwei Integer bilden. Später will ich das ganze zusammensetzen.
Es sollte möglichst performant sein, also kein Umweg über Strings.
Vorkomma ist ganz einfach.
vk_int := Trunc(float1);