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
Benutzerbild von BUG
BUG

Registriert seit: 4. Dez 2003
Ort: Cottbus
2.094 Beiträge
 
#1

AW: Float in zwei Integer zerlegen

  Alt 19. Jun 2015, 21:25
Ich dachte ich kann mich bei einem dymanischen Array nicht darauf verlassen wegen Inserts, Deletes etc.
Stimmt natürlich. Das könnte man nachprüfen, aber ich habe keine Lust mich in dieses TDynArray-Monster einzulesen.

Dann nimm halt das nächstbeste: Der Index in das Array (auf Pointer gecastet).
  Mit Zitat antworten Zitat
Shark99

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

AW: Float in zwei Integer zerlegen

  Alt 19. Jun 2015, 21:30
@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.

Geändert von Shark99 (19. Jun 2015 um 21:33 Uhr)
  Mit Zitat antworten Zitat
Popov
(Gast)

n/a Beiträge
 
#3

AW: Float in zwei Integer zerlegen

  Alt 19. Jun 2015, 21:54
Hatte zuerst TList, aber nach einem Tipp auf TDynArray umgestellt und jede Operation (Insert, Delete, Move, Copy von Teilbereichen) ist 30-300% schneller.
Intern koch die Mama auch nur mit Wasser.

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?
  Mit Zitat antworten Zitat
Shark99

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

AW: Float in zwei Integer zerlegen

  Alt 19. Jun 2015, 22:08
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.

Geändert von Shark99 (19. Jun 2015 um 22:11 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

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

AW: Float in zwei Integer zerlegen

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

Delphi Sorcery - DSharp - Spring4D - TestInsight
  Mit Zitat antworten Zitat
Shark99

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

AW: Float in zwei Integer zerlegen

  Alt 19. Jun 2015, 22:22
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.
  Mit Zitat antworten Zitat
Shark99

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

AW: Float in zwei Integer zerlegen

  Alt 19. Jun 2015, 22:32
Wer Interesse an TDynArray hat, kann ich wärmstens empfehlen:

http://synopse.info/forum/viewtopic.php?id=254

http://synopse.info/files/mORMotNightlyBuild.zip
  Mit Zitat antworten Zitat
Popov
(Gast)

n/a Beiträge
 
#8

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
Antwort Antwort


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 14:10 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-2025 by Thomas Breitkreuz