2013-06-07 23 views
12

私はDelphiで関数に費やされた時間を計算する方法を知りたいと思います。関数の経過時間を計算する方法は?

次に、使用時間を表示し、別の機能またはコンポーネントと比較して、より高速な機能を知りたいと考えました。

+4

可能な重複、['ルーチンの速度を計算する '](http://stackoverflow.com/q/6030586/576719)。 –

+3

間違いなく別の候補:[Delphi - 開始/停止機能でミリ秒単位またはナノ秒単位でタイマを作成する方法は?](http://stackoverflow.com/questions/14834534/delphi-how-to-make-timer-in -milliseconds-or-nanoseconds-with-start-stop-functi) – Glenn1234

答えて

36

あなたは、システムの高分解能パフォーマンスカウンタを使用して経過時間を計測するSystem.DiagnosticsユニットからTStopwatchを使用することができます。

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

は、秒単位で時間値を読み取るには、たとえば、時間間隔から、次の操作を行います。

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

David my Hero。ありがとう – Hidden

+1

はい、彼は私の英雄です^ _^**デルファイ10シアトルのためのデビッド・Heffernanの@ – Bianca

+4

**あなたが '経過使用することをさらに '輸入System.TimeSpan' にあります。TTimeSpan' を成功裏に – lospejos

20

あなたはQueryPerformanceCounterQueryPerformanceFrequency機能を使用することができます。

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

秒またはミリ秒?私はhuuuuge番号を持っているので。私が言ったように、 – Hidden

+0

秒。 –

+0

多分私は何か間違ったことをしましたか? .. Ergebnis:= c2-c1; Label2.Caption:= 'Benhetigte Zeit:' + IntToStr(Ergebnis);そして私はこれを得た... "BenötigteZeit" 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

を疑問に取り組むためのより多くの可能性を持つために、あなたは可能性もSystem.Classes.TThread.GetTickCountを使用して、現在の時間をミリ秒単位で取得してから、メソッドの前にタイマーを開始し、その後メソッドを再実行してください。これらの2つの違いは明らかに経過時間(ミリ秒単位)です。

TStopwatchのDavid Heffernanの提案はよりエレガントであり、より正確です。

関連する問題