Chciałbym wiedzieć, jak obliczyć czas zużywany dla funkcji w Delphi.Jak obliczyć upływający czas funkcji?
Następnie chciałem pokazać wykorzystany czas i porównać go z inną funkcją lub komponentem, aby poznać szybszą funkcję.
Chciałbym wiedzieć, jak obliczyć czas zużywany dla funkcji w Delphi.Jak obliczyć upływający czas funkcji?
Następnie chciałem pokazać wykorzystany czas i porównać go z inną funkcją lub komponentem, aby poznać szybszą funkcję.
Można użyć TStopwatch
z jednostki System.Diagnostics
mierzyć upływający czas za pomocą wysokiej rozdzielczości licznika wydajności systemu.
var
Stopwatch: TStopwatch;
Elapsed: TTimeSpan;
....
Stopwatch := TStopwatch.StartNew;
DoSomething;
Elapsed := Stopwatch.Elapsed;
Aby odczytać wartość czasu w sekundach, powiedzmy, z przedziału czasowego, to zrobić:
var
Seconds: Double;
....
Seconds := Elapsed.TotalSeconds;
Można użyć funkcji QueryPerformanceCounter
i QueryPerformanceFrequency
:
var
c1, c2, f: Int64;
begin
QueryPerformanceFrequency(f);
QueryPerformanceCounter(c1);
DoSomething;
QueryPerformanceCounter(c2);
// Now (c2-c1)/f is the duration in secs of DoSomething
VAR iFrequency, iTimerStart, iTimerEnd: Int64;
procedure TimerStart;
begin
if NOT QueryPerformanceFrequency(iFrequency)
then MesajWarning('High resolution timer not availalbe!');
WinApi.Windows.QueryPerformanceCounter(iTimerStart);
end;
function TimerElapsed: Double; { In miliseconds }
begin
QueryPerformanceCounter(iTimerEnd);
Result:= 1000 * ((iTimerEnd - iTimerStart)/ifrequency);
end;
function TimerElapsedS: string; { In seconds/miliseconds }
begin
if TimerElapsed < 1000
then Result:= Real2Str(TimerElapsed, 2)+ ' ms'
else Result:= Real2Str(TimerElapsed/1000, 2)+ ' s';
end;
Dla mają więcej możliwości przeciwdziałania pytanie, można również użyj numeru System.Classes.TThread.GetTickCount
, aby uzyskać bieżący czas w milisekundach, aby uruchomić zegar przed metodą, a następnie ponownie po metodzie. Różnica między tymi dwoma rzeczami to oczywiście czas, który upłynął w milisekundach, który można przekształcić w godziny, sekundy itd.
Powiedziawszy to, propozycja Davida Heffernana z TStopwatch
jest bardziej elegancka (i bardziej precyzyjna?).
Możliwy duplikat, ["Obliczanie szybkości procedur?"] (Http://stackoverflow.com/q/6030586/576719). –
Zdecydowanie duplikat, inny kandydat: [Delphi - Jak zrobić timer w milisekundach lub nanosekundach z funkcjami start/stop?] (Http://stackoverflow.com/questions/14834534/delphi-how-to-make-timer-in -milliseconds-or-nanoseconds-with-start-stop-functi) – Glenn1234