![]() |
AW: GetTickCount / Fehler bei Bereichsprüfung
QueryPerformanceCounter scheint aber auch ein paar Macken zu haben.
In dem Testprojekt vom himXML hatte ich das drin und auf meinem neuen i7 gibt das Ding keine verwertbaren Ergebnisse mehr raus, bzw. die Werte (also Count / Freq) stimmten absolut nicht. z.B. Mehere Sekunden bis Tage ausgerechnet, aber real nur paar Millisekunden gelaufen oder auch mal andersrum. Woran das lag, hatte ich auf die Schnelle nicht rausbekommen. (lag eventuell am Switchen der Treads in den 8 Kernen oder am ständigen hoch und runtergetackte der Kerne oder ein bug im Delphi) Und den RealTimeStampCounter kann man uch schon länger nicht mehr verwenden, seitdem die CPUs dynamisch tackten und da wo der Counter-Takt an den CPU-Tackt gekoppelt ist. Wenn er überall an die CPU gekoppelt wäre, hätte man damit wenigstens noch die "reale" CPU-Zeit messen können, aber das geht so ja nun auch nicht. |
AW: GetTickCount / Fehler bei Bereichsprüfung
d.h. was würdet ihr vorschlagen?
|
AW: GetTickCount / Fehler bei Bereichsprüfung
Ich hatte das mal so gelöst:
Delphi-Quellcode:
Diese Funktion kann nur eine maximal Zeitdifferenz von besagten 49 Tagen auswerfen. Wie lange der Rechner läuft spielt aber keine Rolle.
function TimeDiff(TickCount: Cardinal): Cardinal;
begin {$ifopt Q+}{$define recoveroverflowcheck}{$Q-}{$endif} Result := GetTickCount - TickCount; {$ifdef recoveroverflowcheck}{$Q+}{$endif} end; |
AW: GetTickCount / Fehler bei Bereichsprüfung
Meine Lösung wäre jetzt die folgende um über den QueryPerformanceCounter ein Performance Ergebnis in Sekunden zu bekommen:
Delphi-Quellcode:
Die Berechnung müsste doch so stimmen???
var
intEnd, intFreq, intStart : Int64; If gsPerformCheck = 'YES' Then QueryPerformanceCounter(intStart); If gsPerformCheck = 'YES' Then Begin QueryPerformanceCounter(intEnd); gdblTimeDiff := (((intEnd - intStart)/intFreq) * 1000) / 1000; prMsgLog(MySQL_Database, tyINF, 99999, '', FloatToStrF(gdblTimeDiff, ffFixed, 5, 3), 'Delete Master Data Tables', gbBlckInfoMsg); End; |
AW: GetTickCount / Fehler bei Bereichsprüfung
Wenn sich intFreq aus QueryPerformanceFrequency ergibt, müsste das stimmen. Aber wieso erst mit 1000 multiplizieren und dann wieder dividieren?
|
AW: GetTickCount / Fehler bei Bereichsprüfung
uups hab was vom source vergessen, hier nochmal komplett:
Delphi-Quellcode:
Keine Ahnung warum ich erst Multipliziert und dann wieder Dividiert hab :oops:var intEnd, intFreq, intStart : Int64; QueryPerformanceFrequency(intFreq); If gsPerformCheck = 'YES' Then QueryPerformanceCounter(intStart); If gsPerformCheck = 'YES' Then Begin QueryPerformanceCounter(intEnd); gdblTimeDiff := (intEnd - intStart)/intFreq; prMsgLog(MySQL_Database, tyINF, 99999, '', FloatToStrF(gdblTimeDiff, ffFixed, 5, 3), 'Delete Master Data Tables', gbBlckInfoMsg); End; Liegt wohl an der Uhrzeit das ich schon etwas verwirrt bin :lol: |
AW: GetTickCount / Fehler bei Bereichsprüfung
Und das hier funktioniert nicht?
Delphi-Quellcode:
Function ElapsedTicks (previousTicks : Cardinal) : Cardinal;
Var currentTicks : Cardinal; Begin currentTicks := GetTickCount(); if currentTicks < previousTicks then result := High(Cardinal) - previousTicks + currentTicks + 1 else result := currentTicks - previousTicks end; Var start : Cardinal; ... begin start := GetTickCount; SomeOperation(); Writeln('Tics elapsed:',ElapsedTicks(start)); |
AW: GetTickCount / Fehler bei Bereichsprüfung
Ab, glaube ich, XE2 würde es noch die Möglichkeit der TStopWatch geben:
Delphi-Quellcode:
var
MyStopWatch : System.Diagnostics.TStopwatch; ElapsedTimeInMilliSeconds : Int64; ElapsedTimeInSeconds, ElapsedTimeInMinutes, ElapsedTimeInHours, ElapsedTimeInDays : Double; begin MyStopWatch := TStopwatch.StartNew; Sleep(10000); MyStopWatch.Stop; ElapsedTimeInMilliSeconds := MyStopWatch.ElapsedMilliseconds; ElapsedTimeInSeconds := ElapsedTimeInMilliSeconds / 1000; ElapsedTimeInMinutes := ElapsedTimeInSeconds / 60; ElapsedTimeInHours := ElapsedTimeInMinutes / 60; ElapsedTimeInDays := ElapsedTimeInHours / 24; end; |
AW: GetTickCount / Fehler bei Bereichsprüfung
Zitat:
result := High(Cardinal) - previousTicks + currentTicks + 1 equivalent zu result := High(Cardinal) + 1 - previousTicks + currentTicks equivalent zu result := 0 - previousTicks + currentTicks equivalent zu result := currentTicks - previousTicks. Die Fallunterscheidung ist dann also unnötig. |
AW: GetTickCount / Fehler bei Bereichsprüfung
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:45 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz