2013-06-07 14 views
12

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ę.

+4

Możliwy duplikat, ["Obliczanie szybkości procedur?"] (Http://stackoverflow.com/q/6030586/576719). –

+3

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

Odpowiedz

36

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; 
+1

David my Hero. Dzięki – Hidden

+1

Tak, on też jest moim bohaterem^_^ – Bianca

+4

@ david-Heffernan dla Delphi 10 ** ** Seattle trzeba 'import System.TimeSpan' dodatkowo użyć ' Upływający. TTimeSpan' powodzeniem – lospejos

20

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 
+0

Seks lub ms? Bo mam niezły numer. – Hidden

+0

sekund, jak już powiedziałem. –

+0

Mh, może zrobiłem coś nie tak? .. Ergebnis: = c2-c1; Label2.Caption: = 'Benötigte Zeit:' + IntToStr (Ergebnis); I mam to ... Spójrz na "Benötigte Zeit" http://db.tt/cEKKB0w5 – Hidden

0
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; 
0

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?).

Powiązane problemy