Delphi-PRAXiS
Seite 4 von 6   « Erste     234 56      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Float in zwei Integer zerlegen (https://www.delphipraxis.net/185560-float-zwei-integer-zerlegen.html)

Popov 19. Jun 2015 22:51

AW: Float in zwei Integer zerlegen
 
Mal ein kleiner Tipp: lass das mit den Delete und Insert, das ist im Grunde Quatsch, denn du schiebst ständig Datenmassen hin und her. Ich hab zwar einen kleine Gedankenfehler gehabt, denn ich hab TDynArray überlesen und dynamische Array verstanden. Trotzdem, viel ändert sich dadurch nicht.

Statt zu löschen, erstelle eine temporäre Liste in die du die Daten kopierst die du benötigst. Das ist schneller, denn jedes Mal wenn du mit Delete etwas löscht, muss alles was drüber ist nach unten verschoben werden. Das kostet Zeit. Und wenn du mit Insert einfügst, muss erst Platz geschaffen werden. Dein Programm ist die ganze Zeit mit Datenschieben beschäftigt.

Anders ist es wenn du stattdessen die Daten die du brauchst in eine neue Liste einfügst. Es wird alles nach oben aufeinander gestapelt. Um das Ganze noch schneller zu machen musst du die Größe der Liste grob einschätzen und den nötigen Speicher mit Capacity reservieren. Ich kenne zwar nicht TDynArray, aber vermutlich arbeitet sie ähnlich wie andere Listen und hat die Eigenschaft Capacity. Die am Anfang groß genug ansetzen, dann muss nicht ständig neuer Platz reserviert werden. Falls man zuviel reserviert hat, kann man es später wieder reduzieren.

Stevie 19. Jun 2015 23:46

AW: Float in zwei Integer zerlegen
 
TDynArray is nicht viel mehr als nen Wrapper über nen dynamisches Array mit einigen Lowlevel Optimizations - kein großes Zauberwerk.
Wenn man dort drin sucht und die Daten nicht sortiert vorliegen hat, dann wird das auch keinen Geschwindigkeitsrekord bringen.

Und ne Hashtable bringt auch nur dann was, wenn die Hashberechnung nicht zu teuer wird (guckstu hier und hier)

Shark99 20. Jun 2015 07:57

AW: Float in zwei Integer zerlegen
 
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.

mkinzler 20. Jun 2015 08:02

AW: Float in zwei Integer zerlegen
 
Zitat:

Zitat von Shark99 (Beitrag 1305853)
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.

Und 58898345 / 24 / 60 / 60 / 1000 ergibt wieder 0,68169380787037

Shark99 20. Jun 2015 08:04

AW: Float in zwei Integer zerlegen
 
Eben, es gibt Rundungsfehler und ich finde den Record nicht wieder.

Dejan Vu 20. Jun 2015 08:14

AW: Float in zwei Integer zerlegen
 
ich habe es immer noch nicht verstanden: Du hast ein Array mit irgendwelchen TDateTime-Werten und willst 1000 davon darstellen. Sind das immer die gleichen, d.h. filterst Du die irgendwie und willst sie dann darstellen? Ist eigentlich auch egal, denn: 1000x irgendein Objekt erzeugen, dauert geschätzte 0.01 Sekunden. Oder weniger.

Anders ausgedrückt: Du kannst beruhigt 1000 Objekte erzeugen, die deinen Record beinhalten.

Allerdings dürfte der Rest deiner Programmierung das Performanceproblem sein. Und falls Du mal 100.000 Werte (oder von mir aus 100 Mio Werte) in einer Listbox darstellen willst, verwende den virtual Mode, wie ihn Popov skizziert hat.

Shark99 20. Jun 2015 08:21

AW: Float in zwei Integer zerlegen
 
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 User kann sagen zeig mir Daten eines Tages aus dem Array in einem Listview an. ListItem.Caption ist also schon mal der string aus dem Record. Aber nun muss ich TDateTime irgendwie in dem Listview abspeichern so dass ich es wieder finde. Werde wohl ein Objekt mit dem TDateTime erzeugen müssen und ein .Data anhängen. Dachte ich kriege es irgendwie anders hin.

Dejan Vu 20. Jun 2015 08:25

AW: Float in zwei Integer zerlegen
 
Ahhh...

Verwende eine Dictionary zum schnellen Finden. Dein dynamisches Array ist einfach die falsche Struktur. Versuchs mal mit einem Baum, einer Skiplist oder eine Dictionary. Damit geht das Einfügen und Suchen sehr schnell (Dictionary ist am schnellsten). Nachteil der Dictionary: Die Daten liegen nicht sortiert vor. Aber wenn man das nicht braucht, würde ich die Dictionary nehmen. Oder den. Oder das. Je nach persönlicher Präferenz.

Shark99 20. Jun 2015 08:31

AW: Float in zwei Integer zerlegen
 
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 vermeiden sollte.

DateTime <> StrToFloat(FloatToStr(DateTime));

Dejan Vu 20. Jun 2015 08:35

AW: Float in zwei Integer zerlegen
 
Da sieht man mal wieder, das man die konkrete Implementierung kapseln/verbergen sollte. Nun hast Du den Salat. Aber im Ernst: Nicht die paar 1000 Objekte sind das Problem, sondern deine Liste.

Also: Wenn Du die 1000 Elemente in der Liste erzeugst, instantiiere dir einfach 1000 Hilfsobjekte, die das TDateTime enthalten. Ich gehe jede Wette ein, das das schnell genug geht:
Delphi-Quellcode:
t := GetTickCount;
for i:=1 to 1000 do foo:= THilfsObjekt.Create;
Writeln (GetTickCount - t);
Ausgabe: 0 oder 18 (ms). Garantiert.


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:54 Uhr.
Seite 4 von 6   « Erste     234 56      

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