2012-04-14 115 views
6

Đây là "thuật toán", nhưng khi tôi muốn đo thời gian thực hiện nó mang lại cho tôi số không. Tại sao?C cách đo thời gian chính xác?

#define ARRAY_SIZE 10000 
... 

clock_t start, end; 

start = clock(); 

for(i = 0; i < ARRAY_SIZE; i++) 
{ 
non_parallel[i] = vec[i] * vec[i]; 
} 
end = clock(); 
printf("Number of seconds: %f\n", (end-start)/(double)CLOCKS_PER_SEC); 

Vì vậy, tôi nên làm gì để đo thời gian?

Trả lời

14

Hai điều:

  1. 10000 không phải là rất nhiều trên một máy tính hiện đại. Do đó vòng lặp đó sẽ chạy trong có lẽ ít hơn một phần nghìn giây - nhỏ hơn độ chính xác của clock(). Do đó nó sẽ trả về 0.

  2. Nếu bạn không sử dụng kết quả của non_parallel có thể là toàn bộ vòng lặp sẽ được tối ưu hóa bởi trình biên dịch.

Rất có thể, bạn chỉ cần một vòng lặp đắt tiền hơn. Hãy thử tăng ARRAY_SIZE lên thứ gì đó lớn hơn nhiều.


Dưới đây là một thử nghiệm trên máy tính của tôi với một kích thước mảng lớn:

#define ARRAY_SIZE 100000000 

int main(){ 

    clock_t start, end; 

    double *non_parallel = (double*)malloc(ARRAY_SIZE * sizeof(double)); 
    double *vec   = (double*)malloc(ARRAY_SIZE * sizeof(double)); 

    start = clock(); 

    for(int i = 0; i < ARRAY_SIZE; i++) 
    { 
     non_parallel[i] = vec[i] * vec[i]; 
    } 

    end = clock(); 
    printf("Number of seconds: %f\n", (end-start)/(double)CLOCKS_PER_SEC); 


    free(non_parallel); 
    free(vec); 
    return 0; 
} 

Output:

Number of seconds: 0.446000 
5

Đây là một cách không đáng tin cậy để thực sự số giây, do hàm clock() có độ chính xác khá thấp và vòng lặp của bạn không hoạt động nhiều. Bạn có thể làm cho vòng lặp của bạn làm nhiều hơn để nó chạy lâu hơn hoặc sử dụng phương pháp định thời gian tốt hơn.

Các phương pháp chính xác cao hơn là nền tảng cụ thể. Đối với Windows, xem How to use QueryPerformanceCounter? và cho linux thấy High resolution timer with C++ and Linux?

+3

Um không, OP đã được đúc một trong những toán hạng thành 'double'. – Mysticial

+0

@ Thất bại về mặt kỹ thuật, đã trả lời câu trả lời của tôi. – jli

+0

Sau đó, tôi có thể +1 ngay bây giờ để đề cập đến các bộ đếm hiệu suất cao. – Mysticial

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