Einzelnen Beitrag anzeigen

Popov
(Gast)

n/a Beiträge
 
#58

AW: Float in zwei Integer zerlegen

  Alt 21. Jun 2015, 14:11
Um ehrlich zu sein verstehe ich immer noch nicht das Problem des TE. Ich sortiere seit Jahren Listen, auch mit Daten und Zeiten, und hab keine Probleme. Das Problem ist weniger TDateTime als der Glaube es irgendwie machen zu müssen.

Hier ein Beispiel mit 10k Daten (also 100.000). Es werden Daten zufällig erzeugt und dann sortiert. Um diese Menge zu sortieren benötigt mein sechs Jahre alte Rechner 120 ms. Wo ist also das Problem?

Delphi-Quellcode:
uses
  Contnrs, DateUtils;

type
  TTest = class
    DateTime: TDateTime;
  end;

var
  ol: TObjectList;

procedure TForm1.Button1Click(Sender: TObject);
const
  MsMax = 24 * 60 * 60 * 1000;
var
  t: TTime;
  i: Integer;
  Test: TTest;

  function CompareDT(Item1, Item2: Pointer): Integer;
  begin
    Result := CompareDateTime(TTest(Item1).DateTime, TTest(Item2).DateTime);
  end;

begin
  t := Now;

  ol.Clear;
  for i := 1 to 100000 do //10k Daten erzeugen
  begin
    Test := TTest.Create;
    Test.DateTime := Random(Trunc(Now)) + (Random(MsMax) / MsMax); //Zufälliges TDateTime
    ol.Add(Test);
  end;

  ol.Sort(@CompareDT);

  with ListView1 do
  begin
    OwnerData := True;
    ViewStyle := vsReport; //1 Column erstellen, breite 150 Pixel
    OwnerData := True;
    Items.Count := ol.Count;
  end;

  ShowMessage('Dauer: ' + IntToStr(MilliSecondsBetween(t, Now)) + 'ms');
end;

procedure TForm1.ListView1Data(Sender: TObject; Item: TListItem);
var
  Test: TTest;
begin
  Test := TTest(ol.Items[Item.Index]);
  Item.Caption := FormatDateTime('dd.MM.yyyy hh:nn:ss', Test.DateTime);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  ol := TObjectList.Create;
end;

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