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 6 von 6   « Erste     456   
Popov
(Gast)

n/a Beiträge
 
#51

AW: Float in zwei Integer zerlegen

  Alt 20. Jun 2015, 21:09
Irgendwie bezweifle ich den Nutzen eines Indexes, den man nur beinahe vergleichen kann.
Gibt es, nennt sich SVerweis in Excel und hat eine Option mit der man einstellen kann ob das Suchkriterium genau sein muss oder nur in der Nähe.
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

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

AW: Float in zwei Integer zerlegen

  Alt 20. Jun 2015, 21:37
Als Index aber alles andere als optimal
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von BUG
BUG

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

AW: Float in zwei Integer zerlegen

  Alt 20. Jun 2015, 21:55
Als Index aber alles andere als optimal
Wenn man nicht gerade einen Hash-basierte Index hat, kann man auch Bereichsabfragen (Wert +/- Epsilon) beschleunigen.

Ansonsten hat sich die Diskussion imho etwas festgelaufen. Eine Lösung für das konkrete Problem (siehe Titel) wurde ja schon genannt und für das eigentliche Problem (die Performance) fehlen Informationen zu den Daten und der Anwendung.

Geändert von BUG (20. Jun 2015 um 23:34 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#54

AW: Float in zwei Integer zerlegen

  Alt 21. Jun 2015, 11:28
Wenn Du nicht vor hast mit den Daten irgendeine Operation durchzuführen, mach's über einen Typecast
Delphi-Quellcode:
type
  TTrenner=packed record t1,t2=integer; end;


...
x.DTpart1:=ttrenner(MyValue).t1;
x.DTpart2:=ttrenner(MyValue).t2;
...
Nur habe ich so meine Zweifel, daß das gut geht.

Gruß
K-H
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
Dejan Vu
(Gast)

n/a Beiträge
 
#55

AW: Float in zwei Integer zerlegen

  Alt 21. Jun 2015, 12:37
Mal zurück zum Thema bzw. dem eigentlichen 'Sinn' der Frage.
1. Eine Liste mit +100k Werten enthält einen TDateTime-Wert.
2. Der Wert soll als Index bzw. Suchbegriff herhalten.
3. Beim speichern und wieder laden als JSON wird der TDateTime auf +/- 1 Sekunde gerundet.

Wg. (3) würde ich dann
a: JSON durch ein anderes Format ersetzen
b: JSON Beibehalten, aber den Suchbegriff ändern

Sagen wir mal, wir wollen JSON beibehalten. Dann könnte eine Lösung so aussehen: Jeder Record hat zusätzlich noch einen Wert 'ID', der erstens 4 Bytes lang ist und zweitens aus dem TDateTime gebildet werden kann. Dieser Wert muss ja nicht mit abgespeichert werden, solange er den +/- 1 Sekunde Fehler kompensieren kann. Ansonsten wird er eben mit abgespeichert.

Oder wir sagen uns: "Blöd, JSON taugt hier eben nicht". Dann können wir die Daten trotzdem sehr einfach ablegen, denn ich kann so einen Record 1:1 (mit Einschränkungen, also kein 'String', sondern nur 'String[X]' etc.) direkt in einen Stream kopieren. Oder ich schreibe mir meinen Reader/Writer für so ein Record mal eben selbst.
  Mit Zitat antworten Zitat
Benutzerbild von Dalai
Dalai

Registriert seit: 9. Apr 2006
1.682 Beiträge
 
Delphi 5 Professional
 
#56

AW: Float in zwei Integer zerlegen

  Alt 21. Jun 2015, 13:45
Es gibt noch eine andere Möglichkeit, auch wenn ich die Tauglichkeit mal offen lasse: TListItem ableiten und mit einem zusätzlichen TDateTime-Attribut ausstatten und die entstehende Klasse statt der TListItems benutzen.

MfG Dalai
  Mit Zitat antworten Zitat
Dejan Vu
(Gast)

n/a Beiträge
 
#57

AW: Float in zwei Integer zerlegen

  Alt 21. Jun 2015, 14:03
Oh natürlich, es gibt viele Wege, dieses Dilemma zu lösen. Ich wollte nur versuchen, die Erkenntnisse zusammenzufassen und dem Thread wieder eine Richtung zu geben.
  Mit Zitat antworten Zitat
Popov
(Gast)

n/a Beiträge
 
#58

AW: Float in zwei Integer zerlegen

  Alt 21. Jun 2015, 15: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
Dejan Vu
(Gast)

n/a Beiträge
 
#59

AW: Float in zwei Integer zerlegen

  Alt 21. Jun 2015, 17:57
10k sind 10.000 aber ansonsten hast Du Recht.
  Mit Zitat antworten Zitat
Popov
(Gast)

n/a Beiträge
 
#60

AW: Float in zwei Integer zerlegen

  Alt 21. Jun 2015, 23:57
Yep, und gleich zwei mal den Fehler gemacht. In dem Fall werden die 10.000 Daten in 15 ms sortiert.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 6 von 6   « Erste     456   


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:18 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