Wenn man häufige Zeitstempel benötigt, dann sind die Windows Funktionen (damit auch now unter Delphi) völlig ungeeignet und liefern nur alle 16 ms eine unterscheidbare Zeit.
Also habe ich mal eine Zeitmessung mit 100 Mikrosekunden Genauigkeit entworfen.
Was 10 Zeitstempeln in einer Millisekunde entspricht.
Das ganze wird über Queryperformancecounter realisiert und über eine Synctime.
Um das Problem zu verdeutlichen, es geht um folgende TestCode:
Delphi-Quellcode:
procedure TForm15.TEstClick(Sender: TObject);
var
sl : TStringList;
cnt : Integer;
zeit, zeit2 : TDAteTime;
zeit3 : DATETIME;
begin
cnt := 0;
sl := TStringList.Create;
while true do begin
inc(cnt);
zeit := Now;
zeit2 := NowHiRes;
zeit3 := NowHiRes;
sl.Add( 'Now Normal Res: ' + FormatDateTime('hh:nn:ss zzzz', zeit ) +
' - Now High Res : ' + FormatDateTime('hh:nn:ss zzzz', zeit2 ) +
' - NowDT HiRes: ' + zeit3.ToString('hh:nn:ss zzzz'));
if cnt > 50000 then begin
memo1.Lines.Text := sl.Text;
break;
end;
end;
sl.free;
end;
dieser erzeugt folgende Ausgabe
Delphi-Quellcode:
Now Normal Res: 13:17:36 312 - Now High Res : 13:17:36 312 - NowDT HiRes: 13:17:36 3120
Now Normal Res: 13:17:36 312 - Now High Res : 13:17:36 312 - NowDT HiRes: 13:17:36 3120
Now Normal Res: 13:17:36 312 - Now High Res : 13:17:36 312 - NowDT HiRes: 13:17:36 3120
Now Normal Res: 13:17:36 312 - Now High Res : 13:17:36 312 - NowDT HiRes: 13:17:36 3121
Now Normal Res: 13:17:36 312 - Now High Res : 13:17:36 312 - NowDT HiRes: 13:17:36 3121
Now Normal Res: 13:17:36 312 - Now High Res : 13:17:36 312 - NowDT HiRes: 13:17:36 3121
Now Normal Res: 13:17:36 312 - Now High Res : 13:17:36 312 - NowDT HiRes: 13:17:36 3121
Now Normal Res: 13:17:36 312 - Now High Res : 13:17:36 312 - NowDT HiRes: 13:17:36 3121
Now Normal Res: 13:17:36 312 - Now High Res : 13:17:36 312 - NowDT HiRes: 13:17:36 3121
Now Normal Res: 13:17:36 312 - Now High Res : 13:17:36 312 - NowDT HiRes: 13:17:36 3121
Now Normal Res: 13:17:36 312 - Now High Res : 13:17:36 312 - NowDT HiRes: 13:17:36 3121
Now Normal Res: 13:17:36 312 - Now High Res : 13:17:36 312 - NowDT HiRes: 13:17:36 3121
Now Normal Res: 13:17:36 312 - Now High Res : 13:17:36 312 - NowDT HiRes: 13:17:36 3121
Now Normal Res: 13:17:36 312 - Now High Res : 13:17:36 312 - NowDT HiRes: 13:17:36 3122
Now Normal Res: 13:17:36 312 - Now High Res : 13:17:36 312 - NowDT HiRes: 13:17:36 3122
Now Normal Res: 13:17:36 312 - Now High Res : 13:17:36 312 - NowDT HiRes: 13:17:36 3122
Now Normal Res: 13:17:36 312 - Now High Res : 13:17:36 312 - NowDT HiRes: 13:17:36 3122
Now Normal Res: 13:17:36 312 - Now High Res : 13:17:36 312 - NowDT HiRes: 13:17:36 3122
Now Normal Res: 13:17:36 312 - Now High Res : 13:17:36 312 - NowDT HiRes: 13:17:36 3122
Now Normal Res: 13:17:36 312 - Now High Res : 13:17:36 312 - NowDT HiRes: 13:17:36 3122
Now Normal Res: 13:17:36 312 - Now High Res : 13:17:36 312 - NowDT HiRes: 13:17:36 3122
Now Normal Res: 13:17:36 312 - Now High Res : 13:17:36 312 - NowDT HiRes: 13:17:36 3122
Now Normal Res: 13:17:36 312 - Now High Res : 13:17:36 312 - NowDT HiRes: 13:17:36 3122
Now Normal Res: 13:17:36 312 - Now High Res : 13:17:36 312 - NowDT HiRes: 13:17:36 3122
Now Normal Res: 13:17:36 312 - Now High Res : 13:17:36 312 - NowDT HiRes: 13:17:36 3123
Now Normal Res: 13:17:36 312 - Now High Res : 13:17:36 312 - NowDT HiRes: 13:17:36 3123
Now Normal Res: 13:17:36 312 - Now High Res : 13:17:36 312 - NowDT HiRes: 13:17:36 3123
Now Normal Res: 13:17:36 312 - Now High Res : 13:17:36 312 - NowDT HiRes: 13:17:36 3123
Now Normal Res: 13:17:36 312 - Now High Res : 13:17:36 312 - NowDT HiRes: 13:17:36 3123
Now Normal Res: 13:17:36 312 - Now High Res : 13:17:36 312 - NowDT HiRes: 13:17:36 3123
Now Normal Res: 13:17:36 312 - Now High Res : 13:17:36 312 - NowDT HiRes: 13:17:36 3123
Now Normal Res: 13:17:36 312 - Now High Res : 13:17:36 312 - NowDT HiRes: 13:17:36 3123
Now Normal Res: 13:17:36 312 - Now High Res : 13:17:36 312 - NowDT HiRes: 13:17:36 3123
Now Normal Res: 13:17:36 312 - Now High Res : 13:17:36 312 - NowDT HiRes: 13:17:36 3123
Now Normal Res: 13:17:36 312 - Now High Res : 13:17:36 312 - NowDT HiRes: 13:17:36 3124
Now Normal Res: 13:17:36 312 - Now High Res : 13:17:36 312 - NowDT HiRes: 13:17:36 3124
Now Normal Res: 13:17:36 312 - Now High Res : 13:17:36 312 - NowDT HiRes: 13:17:36 3124
Now Normal Res: 13:17:36 312 - Now High Res : 13:17:36 312 - NowDT HiRes: 13:17:36 3124
Now Normal Res: 13:17:36 312 - Now High Res : 13:17:36 312 - NowDT HiRes: 13:17:36 3124
Now Normal Res: 13:17:36 312 - Now High Res : 13:17:36 312 - NowDT HiRes: 13:17:36 3124
Now Normal Res: 13:17:36 312 - Now High Res : 13:17:36 312 - NowDT HiRes: 13:17:36 3124
Now Normal Res: 13:17:36 312 - Now High Res : 13:17:36 312 - NowDT HiRes: 13:17:36 3124
Now Normal Res: 13:17:36 312 - Now High Res : 13:17:36 312 - NowDT HiRes: 13:17:36 3124
Now Normal Res: 13:17:36 312 - Now High Res : 13:17:36 312 - NowDT HiRes: 13:17:36 3124
Now Normal Res: 13:17:36 312 - Now High Res : 13:17:36 312 - NowDT HiRes: 13:17:36 3125
Now Normal Res: 13:17:36 312 - Now High Res : 13:17:36 312 - NowDT HiRes: 13:17:36 3125
Now Normal Res: 13:17:36 312 - Now High Res : 13:17:36 312 - NowDT HiRes: 13:17:36 3125
Now Normal Res: 13:17:36 312 - Now High Res : 13:17:36 312 - NowDT HiRes: 13:17:36 3125
Now Normal Res: 13:17:36 312 - Now High Res : 13:17:36 312 - NowDT HiRes: 13:17:36 3125
Now Normal Res: 13:17:36 312 - Now High Res : 13:17:36 312 - NowDT HiRes: 13:17:36 3125
Now Normal Res: 13:17:36 312 - Now High Res : 13:17:36 312 - NowDT HiRes: 13:17:36 3125
Now Normal Res: 13:17:36 328 - Now High Res : 13:17:36 312 - NowDT HiRes: 13:17:36 3125
Now Normal Res: 13:17:36 328 - Now High Res : 13:17:36 312 - NowDT HiRes: 13:17:36 3125
Now Normal Res: 13:17:36 328 - Now High Res : 13:17:36 313 - NowDT HiRes: 13:17:36 3126
Now Normal Res: 13:17:36 328 - Now High Res : 13:17:36 313 - NowDT HiRes: 13:17:36 3126
Now Normal Res: 13:17:36 328 - Now High Res : 13:17:36 313 - NowDT HiRes: 13:17:36 3126
Now Normal Res: 13:17:36 328 - Now High Res : 13:17:36 313 - NowDT HiRes: 13:17:36 3126
Now Normal Res: 13:17:36 328 - Now High Res : 13:17:36 313 - NowDT HiRes: 13:17:36 3126
Now Normal Res: 13:17:36 328 - Now High Res : 13:17:36 313 - NowDT HiRes: 13:17:36 3126
Now Normal Res: 13:17:36 328 - Now High Res : 13:17:36 313 - NowDT HiRes: 13:17:36 3126
Now Normal Res: 13:17:36 328 - Now High Res : 13:17:36 313 - NowDT HiRes: 13:17:36 3126
Now Normal Res: 13:17:36 328 - Now High Res : 13:17:36 313 - NowDT HiRes: 13:17:36 3126
Now Normal Res: 13:17:36 328 - Now High Res : 13:17:36 313 - NowDT HiRes: 13:17:36 3126
Now Normal Res: 13:17:36 328 - Now High Res : 13:17:36 313 - NowDT HiRes: 13:17:36 3127
Now Normal Res: 13:17:36 328 - Now High Res : 13:17:36 313 - NowDT HiRes: 13:17:36 3127
Now Normal Res: 13:17:36 328 - Now High Res : 13:17:36 313 - NowDT HiRes: 13:17:36 3127
Now Normal Res: 13:17:36 328 - Now High Res : 13:17:36 313 - NowDT HiRes: 13:17:36 3127
Now Normal Res: 13:17:36 328 - Now High Res : 13:17:36 313 - NowDT HiRes: 13:17:36 3127
Now Normal Res: 13:17:36 328 - Now High Res : 13:17:36 313 - NowDT HiRes: 13:17:36 3127
Now Normal Res: 13:17:36 328 - Now High Res : 13:17:36 313 - NowDT HiRes: 13:17:36 3127
Now Normal Res: 13:17:36 328 - Now High Res : 13:17:36 313 - NowDT HiRes: 13:17:36 3127
Now Normal Res: 13:17:36 328 - Now High Res : 13:17:36 313 - NowDT HiRes: 13:17:36 3127
Now Normal Res: 13:17:36 328 - Now High Res : 13:17:36 313 - NowDT HiRes: 13:17:36 3127
Now Normal Res: 13:17:36 328 - Now High Res : 13:17:36 313 - NowDT HiRes: 13:17:36 3128
Now Normal Res: 13:17:36 328 - Now High Res : 13:17:36 313 - NowDT HiRes: 13:17:36 3128
Now Normal Res: 13:17:36 328 - Now High Res : 13:17:36 313 - NowDT HiRes: 13:17:36 3128
Now Normal Res: 13:17:36 328 - Now High Res : 13:17:36 313 - NowDT HiRes: 13:17:36 3128
Now Normal Res: 13:17:36 328 - Now High Res : 13:17:36 313 - NowDT HiRes: 13:17:36 3128
Now Normal Res: 13:17:36 328 - Now High Res : 13:17:36 313 - NowDT HiRes: 13:17:36 3128
Now Normal Res: 13:17:36 328 - Now High Res : 13:17:36 313 - NowDT HiRes: 13:17:36 3128
Now Normal Res: 13:17:36 328 - Now High Res : 13:17:36 313 - NowDT HiRes: 13:17:36 3128
Now Normal Res: 13:17:36 328 - Now High Res : 13:17:36 313 - NowDT HiRes: 13:17:36 3128
Now Normal Res: 13:17:36 328 - Now High Res : 13:17:36 313 - NowDT HiRes: 13:17:36 3128
Now Normal Res: 13:17:36 328 - Now High Res : 13:17:36 313 - NowDT HiRes: 13:17:36 3128
Now Normal Res: 13:17:36 328 - Now High Res : 13:17:36 313 - NowDT HiRes: 13:17:36 3129
Now Normal Res: 13:17:36 328 - Now High Res : 13:17:36 313 - NowDT HiRes: 13:17:36 3129
Now Normal Res: 13:17:36 328 - Now High Res : 13:17:36 313 - NowDT HiRes: 13:17:36 3129
Now Normal Res: 13:17:36 328 - Now High Res : 13:17:36 313 - NowDT HiRes: 13:17:36 3129
Now Normal Res: 13:17:36 328 - Now High Res : 13:17:36 313 - NowDT HiRes: 13:17:36 3129
Now Normal Res: 13:17:36 328 - Now High Res : 13:17:36 313 - NowDT HiRes: 13:17:36 3129
Now Normal Res: 13:17:36 328 - Now High Res : 13:17:36 313 - NowDT HiRes: 13:17:36 3129
man sieht folgendes Problem:
die Millisekunden bleiben lange zeit bei 312, und springen dann irgendwann plötzlich auf 328.
die Funktion NowHiRes zählt aber 100 Mikrosekunden weise hoch.
erst 3120 und das nächste ist 3121
Bei der Formatierung auf Mikrosekunden hatte ich im Moment keine Lust, nachzudenken.
Nur bitte nicht wunden, um die Mikrosekunden auszugeben, habe ich mal schnell
meine eigene DATETIME Klasse benutzt, die auf Integerbasis mit 6 Byte Größe auf 100 Mikrosekunden Genauigkeit ausgelegt ist. (Ersparnis von 2 Byte gegenüber Double).
Die Genauigkeit steckt aber garantiert im Double Wert drin! Auch wenn sich der geneigte Leser noch eine eigene Ausgabe basteln muss.
so, nun zur eigentlichen Funktion NowHiRes:
(Zuweisebare typisierte Konstanten müssen angekreuzt sein, oder man baut den Code um auf globael Variablen)
Delphi-Quellcode:
function Inc100MicroSeconds(const AValue: TDateTime; const ANumberOf100Microseconds: Int64): TDateTime;
begin
Result := ((AValue * MSecsPerDay * 10) + ANumberOf100Microseconds) / (MSecsPerDay * 10);
end;
//==============================================================================
function NowHiRes : Double;
const
frequency : TLargeInteger = 0;
Sync : TLargeInteger = 0;
Current : TLargeInteger = 0;
SyncTime : Double = 0;
LastRequestetTime : Double = 0;
begin
if frequency = 0 then begin
QueryPerformanceFrequency(frequency);
end;
if SecondsBetween(now, syncTime) > 30 then begin
QueryPerformanceCounter(Sync);
result := now;
SyncTime := result;
if result <= LastRequestetTime then begin
result := Inc100MicroSeconds(LastRequestetTime,1);
SyncTime := 0;
end;
LastRequestetTime := result;
end else begin
QueryPerformanceCounter(Current);
Result := Inc100MicroSeconds(SyncTime, round( (Current - Sync) / Frequency * 10000));
LastRequestetTime := result;
end;
end;
//==============================================================================
Phantasie ist etwas, was sich manche Leute gar nicht vorstellen können.