2013-06-07 12 views
12

Mi piacerebbe sapere come calcolare il tempo consumato per una funzione in Delphi.Come calcolare il tempo trascorso di una funzione?

Quindi volevo mostrare il tempo impiegato e confrontarlo con un'altra funzione o componente in modo da conoscere la funzione più veloce.

+4

Possibile duplicato, ['Calcolo della velocità delle routine?'] (Http://stackoverflow.com/q/6030586/576719). –

+3

Definitivamente un duplicato, un altro candidato: [Delphi - Come creare un timer in millisecondi o nanosecondi con funzioni start/stop?] (Http://stackoverflow.com/questions/14834534/delphi-how-to-make-timer-in -milliseconds-or-nanoseconds-with-start-stop-functi) – Glenn1234

risposta

36

È possibile utilizzare TStopwatch dall'unità System.Diagnostics per misurare il tempo trascorso con contatore di prestazioni ad alta risoluzione del sistema.

var 
    Stopwatch: TStopwatch; 
    Elapsed: TTimeSpan; 
.... 
Stopwatch := TStopwatch.StartNew; 
DoSomething; 
Elapsed := Stopwatch.Elapsed; 

Per leggere un valore di tempo in secondi, per esempio, da un arco di tempo, fare questo:

var 
    Seconds: Double; 
.... 
Seconds := Elapsed.TotalSeconds; 
+1

David my Hero, grazie – Hidden

+1

Sì, anche lui è il mio eroe^_^ – Bianca

+4

@ David-Heffernan per ** Delphi 10 Seattle ** bisogna 'importazione System.TimeSpan' inoltre di utilizzare ' trascorso:. TTimeSpan' successo – lospejos

20

Offriamo le QueryPerformanceCounter e QueryPerformanceFrequency funzioni:

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

Sec o ms? Perché ho un numero da huuuuge. – Hidden

+0

secondi, come ho detto. –

+0

Mh forse ho fatto qualcosa di sbagliato? .. Ergebnis: = c2-c1; Label2.Caption: = 'Benötigte Zeit:' + IntToStr (Ergebnis); E ho questo ... Guarda "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

Per il gusto di avere più possibilità per affrontare la questione, si potrebbe anche utilizzare System.Classes.TThread.GetTickCount per ottenere un'ora corrente in millisecondi per avviare il timer prima del metodo, quindi nuovamente dopo il metodo. La differenza tra questi due è ovviamente il tempo trascorso in millisecondi, che potresti trasformare in ore, secondi, ecc.

Detto questo, la proposta di David Heffernan con TStopwatch è più elegante (e più precisa?).