2013-06-07 9 views
12

Ich würde gerne wissen, wie man den Zeitaufwand für eine Funktion in Delphi berechnet.Wie wird die abgelaufene Zeit einer Funktion berechnet?

Dann wollte ich die verwendete Zeit zeigen und vergleichen Sie sie mit einer anderen Funktion oder Komponente, um die schnellere Funktion zu kennen.

+4

Mögliches Duplikat, ['Berechnung der Geschwindigkeit von Routinen?'] (Http://stackoverflow.com/q/6030586/576719). –

+3

Definitiv ein Duplikat, ein anderer Kandidat: [Delphi - Wie man Timer in Millisekunden oder Nanosekunden mit Start/Stop-Funktionen macht?] (Http://stackoverflow.com/questions/14834534/delphi-how-to-make-timer-in -Millisekunden-oder-Nanosekunden-mit-Start-Stop-Funktion) – Glenn1234

Antwort

36

Sie TStopwatch vom System.Diagnostics Gerät verwenden können hochauflösende Leistungsindikator des Systems verstrichene Zeit zu messen, verwendet wird.

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

Um einen Zeitwert in Sekunden, sagen wir, von einer Zeitspanne zu lesen, dies tun:

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

David mein Held Danke – Hidden

+1

Ja, er ist mein Held auch^_^ – Bianca

+4

@ david-heffernan für ** 10 Seattle Delphi ** Sie müssen 'Import System.TimeSpan' zusätzlich ' Abgelaufene zu verwenden:. TTimeSpan' erfolgreich – lospejos

20

können Sie die QueryPerformanceCounter und QueryPerformanceFrequency Funktionen nutzen:

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

Secs oder ms? Weil ich eine riesige Nummer bekommen habe. – Hidden

+0

Sekunden, wie ich schon sagte. –

+0

Mh vielleicht habe ich etwas falsch gemacht? .. Ergebnis: = c2-c1; Label2.Caption: = 'Benötigte Zeit:' + IntToStr (Ergebnis); Und ich habe das ... Sieh dir "Benötigte Zeit" an 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

Aus Gründen für die Bewältigung der Frage mehr Möglichkeiten haben, können Sie auch Verwenden Sie System.Classes.TThread.GetTickCount, um eine aktuelle Zeit in Millisekunden zu erhalten, um den Timer vor der Methode und dann nach der Methode zu starten. Der Unterschied zwischen diesen beiden ist offensichtlich die verstrichene Zeit in Millisekunden, die Sie in Stunden, Sekunden usw. umwandeln können.

Having said, David Heffernan Vorschlag mit TStopwatch ist eleganter (und genauer?).

Verwandte Themen