Delphi-PRAXiS
Seite 3 von 6     123 45     Letzte »    

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)

BUG 19. Jun 2015 21:12

AW: Float in zwei Integer zerlegen
 
Zitat:

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

Shark99 19. Jun 2015 21:14

AW: Float in zwei Integer zerlegen
 
Ich dachte ich kann mich bei einem dymanischen Array nicht darauf verlassen wegen Inserts, Deletes etc.

Popov 19. Jun 2015 21:19

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

BUG 19. Jun 2015 21:25

AW: Float in zwei Integer zerlegen
 
Zitat:

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

Shark99 19. Jun 2015 21:30

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

Popov 19. Jun 2015 21:54

AW: Float in zwei Integer zerlegen
 
Zitat:

Zitat von Shark99 (Beitrag 1305832)
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?

Shark99 19. Jun 2015 22:08

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

Stevie 19. Jun 2015 22:19

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

Shark99 19. Jun 2015 22:22

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

Shark99 19. Jun 2015 22:32

AW: Float in zwei Integer zerlegen
 
Wer Interesse an TDynArray hat, kann ich wärmstens empfehlen:

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

http://synopse.info/files/mORMotNightlyBuild.zip


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:57 Uhr.
Seite 3 von 6     123 45     Letzte »    

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