AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Float in zwei Integer zerlegen

Ein Thema von Shark99 · begonnen am 19. Jun 2015 · letzter Beitrag vom 21. Jun 2015
Antwort Antwort
Seite 4 von 6   « Erste     234 56      
Popov
(Gast)

n/a Beiträge
 
#31

AW: Float in zwei Integer zerlegen

  Alt 19. Jun 2015, 22:51
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.
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

Registriert seit: 12. Aug 2003
Ort: Soest
4.008 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#32

AW: Float in zwei Integer zerlegen

  Alt 19. Jun 2015, 23:46
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)
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight

Geändert von Stevie (19. Jun 2015 um 23:49 Uhr)
  Mit Zitat antworten Zitat
Shark99

Registriert seit: 16. Mai 2007
403 Beiträge
 
#33

AW: Float in zwei Integer zerlegen

  Alt 20. Jun 2015, 07:57
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.
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#34

AW: Float in zwei Integer zerlegen

  Alt 20. Jun 2015, 08:02
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
Markus Kinzler
  Mit Zitat antworten Zitat
Shark99

Registriert seit: 16. Mai 2007
403 Beiträge
 
#35

AW: Float in zwei Integer zerlegen

  Alt 20. Jun 2015, 08:04
Eben, es gibt Rundungsfehler und ich finde den Record nicht wieder.
  Mit Zitat antworten Zitat
Dejan Vu
(Gast)

n/a Beiträge
 
#36

AW: Float in zwei Integer zerlegen

  Alt 20. Jun 2015, 08:14
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.
  Mit Zitat antworten Zitat
Shark99

Registriert seit: 16. Mai 2007
403 Beiträge
 
#37

AW: Float in zwei Integer zerlegen

  Alt 20. Jun 2015, 08:21
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.
  Mit Zitat antworten Zitat
Dejan Vu
(Gast)

n/a Beiträge
 
#38

AW: Float in zwei Integer zerlegen

  Alt 20. Jun 2015, 08:25
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.
  Mit Zitat antworten Zitat
Shark99

Registriert seit: 16. Mai 2007
403 Beiträge
 
#39

AW: Float in zwei Integer zerlegen

  Alt 20. Jun 2015, 08:31
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));
  Mit Zitat antworten Zitat
Dejan Vu
(Gast)

n/a Beiträge
 
#40

AW: Float in zwei Integer zerlegen

  Alt 20. Jun 2015, 08:35
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.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 4 von 6   « Erste     234 56      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:50 Uhr.
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