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 3 von 6     123 45     Letzte »    
Benutzerbild von BUG
BUG

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

AW: Float in zwei Integer zerlegen

  Alt 19. Jun 2015, 22:12
Weil das Array aus Records und nicht aus Objekten besteht.
Wo ist das Problem? Im Prinzip kannst du auf jede Stelle im Speicher zeigen, egal was da für ein Datentyp liegt. Records sind da keine Ausnahme.
  Mit Zitat antworten Zitat
Shark99

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

AW: Float in zwei Integer zerlegen

  Alt 19. Jun 2015, 22:14
Ich dachte ich kann mich bei einem dymanischen Array nicht darauf verlassen wegen Inserts, Deletes etc.
  Mit Zitat antworten Zitat
Popov
(Gast)

n/a Beiträge
 
#23

AW: Float in zwei Integer zerlegen

  Alt 19. Jun 2015, 22:19
In der letzten Zeit bin ich ein Fan von virtuellen Listen, sowohl bei ListBoxen, wie auch bei ListViews. Verwaltet werden die Daten in einer ObjectList und lediglich angezeigt in ListView. Der Vorteil, dadurch wird das Ganze viel schneller. Der Grund - hier muss ListView nicht die ganzen Daten schleppen, die bleiben in der ObjectList. ListView ist nur noch für die Anzeige der paar Items die gerade sichtbar sind:

Delphi-Quellcode:
uses
  Contnrs;

type
  TTest = class
    Num: Integer;
    DateTime: TDateTime;
  end;

var
  ol: TObjectList;

procedure TForm1.FormCreate(Sender: TObject);
var
  d: Integer;
  Test: TTest;
  Col: TListColumn;
begin
  //Hier eine ObjectList Liste erstellen
  ol := TObjectList.Create(True);

  //Hier die Liste mit Daten füllen
  for d := Trunc(Now) - 365 to Trunc(Now) do
  begin
    Test := TTest.Create;
    Test.Num := Random(1000);
    Test.DateTime := d + Now;
    ol.Add(Test);
  end;

  with ListView1 do
  begin
    ViewStyle := vsReport;
    Col := Columns.Add; //Beschriftungen
    Col.Caption := 'Num';
    Col := Columns.Add;
    Col.Caption := 'Date';
    Col.Width := 150;

    OwnerData := True;
    Items.Count := ol.Count;
  end;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  ol.Free;
end;

procedure TForm1.ListView1Data(Sender: TObject; Item: TListItem);
var
  Test: TTest;
begin
  Test := TTest(ol[Item.Index]); //hier werden die Daten aus ObjectList an ListView übertragen
  Item.Caption := IntToStr(Test.Num);
  Item.SubItems.Add(DateTimeToStr(Test.DateTime));
end;
Um das Beispiel umzusetzen reicht ein ListView auf dem Formular.

Geändert von Popov (19. Jun 2015 um 22:21 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von BUG
BUG

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

AW: Float in zwei Integer zerlegen

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

AW: Float in zwei Integer zerlegen

  Alt 19. Jun 2015, 22: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 22:33 Uhr)
  Mit Zitat antworten Zitat
Popov
(Gast)

n/a Beiträge
 
#26

AW: Float in zwei Integer zerlegen

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

AW: Float in zwei Integer zerlegen

  Alt 19. Jun 2015, 23: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 23:11 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

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

AW: Float in zwei Integer zerlegen

  Alt 19. Jun 2015, 23: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
 
#29

AW: Float in zwei Integer zerlegen

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

AW: Float in zwei Integer zerlegen

  Alt 19. Jun 2015, 23: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
Antwort Antwort
Seite 3 von 6     123 45     Letzte »    


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 04:06 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