2010-08-24 64 views
30

Tôi muốn tìm hiểu xem một số đoạn mã thực hiện bao lâu (xấp xỉ). Một cái gì đó như thế này:Làm cách nào để đo thời gian trong C?

startStopwatch(); 
// do some calculations 
stopStopwatch(); 
printf("%lf", timeMesuredInSeconds); 

Làm thế nào?

+1

Nền tảng của bạn là gì? – pmod

+0

@Pmod Bạn có ý nghĩa gì bởi nền tảng? Hệ điều hành của tôi là Windows. – snakile

+1

Bạn muốn đạt được độ phân giải nào và bạn có thể chịu được bao nhiêu chi phí tích lũy? –

Trả lời

47

Bạn có thể sử dụng phương pháp clock trong time.h

Ví dụ:

clock_t start = clock(); 
/*Do something*/ 
clock_t end = clock(); 
float seconds = (float)(end - start)/CLOCKS_PER_SEC; 
+0

+1: Đẹp và đơn giản. Tuy nhiên, bạn sẽ không cần phải cast '(end - start)' vào một điểm trôi nổi trước khi phân chia nếu bạn muốn nhận được phân số của một giây? – torak

+0

@torak Vâng, tôi nghĩ bạn nói đúng, tôi chưa có cơ hội thử nghiệm nó. – KLee1

+0

Hoặc nhân với 1.0 –

16

Bạn có thể sử dụng time.h thư viện, đặc biệt là timedifftime chức năng:

/* difftime example */ 
#include <stdio.h> 
#include <time.h> 

int main() 
{ 
    time_t start,end; 
    double dif; 

    time (&start); 
    // Do some calculation. 
    time (&end); 
    dif = difftime (end,start); 
    printf ("Your calculations took %.2lf seconds to run.\n", dif); 

    return 0; 
} 

(Ví dụ chuyển thể từ các trang web khác nhau được liên kết ở trên.)

Xin lưu ý rằng phương pháp này chỉ có thể cung cấp số giây chính xác - time_t ghi lại số giây từ UNIX epoch (ngày 1 tháng 1 năm 1970).

+0

Tính năng này chỉ mất vài giây. Và ví dụ của bạn thực sự không sử dụng ''. – Dummy00001

+0

Xin lỗi, chữ 'c' là lỗi đánh máy - thư viện ctime được định nghĩa trong 'time.h'. Và có, nó chỉ cho độ chính xác vài giây. Xem xét các poster nói "khoảng", tôi xem xét đủ. – Stephen

0

Nếu bạn không cần độ phân giải tuyệt vời, bạn có thể sử dụng GetTickCount(): http://msdn.microsoft.com/en-us/library/ms724408(VS.85).aspx (Nếu nó không phải là chẩn đoán đơn giản của riêng bạn, thì lưu ý rằng số này có thể quấn quanh, vì vậy bạn sẽ cần phải xử lý với một số học nhỏ).

QueryPerformanceCounter là một tùy chọn hợp lý khác. (Nó cũng được mô tả trên MSDN)

0

Tôi sẽ sử dụng các chức năng QueryPerformanceCounterQueryPerformanceFrequency của API Windows. Gọi trước đây trước và sau khối và trừ (hiện tại − cũ) để có được số lượng "bọ ve" giữa các cá thể. Chia giá trị này bằng giá trị thu được bằng hàm thứ hai để nhận thời lượng tính bằng giây.

2

GetTickCount().

#include <windows.h> 
void MeasureIt() 
{ 
    DWORD dwStartTime = GetTickCount(); 
    DWORD dwElapsed; 

    DoSomethingThatYouWantToTime(); 

    dwElapsed = GetTickCount() - dwStartTime; 

    printf("It took %d.%3d seconds to complete\n", dwElapsed/1000, dwElapsed - dwElapsed/1000); 
} 
Các vấn đề liên quan