2013-06-07 46 views
12

Tôi muốn biết cách tính thời gian cho một hàm trong Delphi.Cách tính thời gian trôi qua của một hàm?

Sau đó, tôi muốn hiển thị thời gian đã sử dụng và so sánh nó với một hàm hoặc thành phần khác để biết hàm nhanh hơn.

+4

Có thể trùng lặp, ['Tính tốc độ của các thường trình?'] (Http://stackoverflow.com/q/6030586/576719). –

+3

Chắc chắn là một bản sao, một ứng cử viên khác: [Delphi - Làm thế nào để làm cho bộ đếm thời gian tính bằng mili giây hoặc nano giây với chức năng khởi động/dừng?] (Http://stackoverflow.com/questions/14834534/delphi-how-to-make-timer-in -milliseconds-hoặc-nano giây-với-start-stop-functi) – Glenn1234

Trả lời

36

Bạn có thể sử dụng TStopwatch từ các đơn vị System.Diagnostics để đo thời gian trôi qua sử dụng của hệ thống có độ phân giải cao hiệu suất truy cập.

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

Để đọc một giá trị thời gian trong vài giây, nói, từ một khoảng thời gian, làm việc này:

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

David my Hero Cảm ơn – Hidden

+1

Vâng, anh ấy cũng là anh hùng của tôi^_^ – Bianca

+4

@ david-Heffernan cho ** Delphi 10 Seattle ** bạn phải 'nhập khẩu System.TimeSpan' bổ sung để sử dụng ' Elapsed:. TTimeSpan' thành công – lospejos

20

Bạn có thể sử dụng các chức năng 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

Secs hoặc ms? Bởi vì tôi có một số huuuuge. – Hidden

+0

giây, như tôi đã nói. –

+0

Có lẽ tôi đã làm gì sai? .. Ergebnis: = c2-c1; Label2.Caption: = 'Benötigte Zeit:' + IntToStr (Ergebnis); Và tôi hiểu điều này ... Nhìn vào "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

Vì lợi ích của việc có khả năng hơn để giải quyết những câu hỏi, bạn cũng có thể sử dụng System.Classes.TThread.GetTickCount để nhận thời gian hiện tại tính bằng mili giây để bắt đầu hẹn giờ trước phương pháp của bạn, và sau đó lại sau phương pháp của bạn. Sự khác biệt giữa hai điều này rõ ràng là thời gian trôi qua tính bằng mili giây, mà bạn có thể chuyển thành giờ, giây, v.v.

Có đề xuất của David Heffernan là thanh lịch hơn (và chính xác hơn).

Các vấn đề liên quan