2012-10-04 42 views
6

Sau khi đọc this article khoảng thời gian trôi qua, tôi đã viết một mã đơn giản để tính toán thời gian thực hiện một vòng lặp:Làm thế nào để sử dụng struct timeval để có được thời gian thực hiện?

#include <stdio.h> 
#include <sys/time.h> 

int main (int argc, char** argv) { 
    struct timeval, tvalBefore, tvalAfter; 

    gettimeofday (&tvalBefore, NULL); 
    int i =0; 
    while (i < 1000) { 
     i ++; 
    } 

    gettimeofday (&tvalAfter, NULL); 

    printf("Time in microseconds: %0.3f microseconds\n", 
      (float)(tvalAfter.tv_sec - tvalBefore.tv_sec) 
     ) 
    return 0; 
} 

Trình biên dịch kêu vang mang lại cho tôi những lỗi sau đây:

print_time.c:7:16: error: expected identifier or '(' 
     struct timeval, *tvalBefore, *tvalAfter; 
        ^
print_time.c:13:17: error: use of undeclared identifier 'tvalBefore' 
     gettimeofday (&tvalBefore, NULL); 
        ^
print_time.c:19:17: error: use of undeclared identifier 'tvalAfter' 
     gettimeofday (&tvalAfter, NULL); 
        ^
print_time.c:22:12: error: use of undeclared identifier 'tvalAfter' 
         (float)(tvalAfter.tv_sec - tvalBefore.tv_sec) 
           ^
print_time.c:22:31: error: use of undeclared identifier 'tvalBefore' 
         (float)(tvalAfter.tv_sec - tvalBefore.tv_sec) 
               ^
5 errors generated. 

tôi không thể tìm ra những gì sai với mã của tôi, bất kỳ ý tưởng?

+2

Đi ra rằng dấu phẩy sau 'struct timeval' – LSerni

+3

Không sử dụng gettimeofday để đo thời gian thực hiện! Đọc này: http://blog.habets.pp.se/2010/09/gettimeofday-should-never-be-used-to-measure-time và điều này: http://stackoverflow.com/questions/12392278/getrusage -vs-clock-gettime-vs-clock-vs-gettimeofday/12480485 # 12480485 –

+1

@ DouglasB.Staple cảm ơn vì đã cho tôi biết sự cố này – mko

Trả lời

18

Bạn có hai lỗi đánh máy trong mã của bạn:

struct timeval, 

nên

struct timeval 

và sau khi printf() ngoặc bạn cần một dấu chấm phẩy.

Ngoài ra, tùy thuộc vào trình biên dịch, quá trình đơn giản có thể được tối ưu hóa, cho bạn thời gian là 0 micro giây bất kể bạn làm gì.

Cuối cùng, tính toán thời gian là sai. Bạn chỉ tính đến số giây, bỏ qua micro giây. Bạn cần phải nhận được sự khác biệt giữa giây, nhân với một triệu, sau đó thêm "sau" tv_usec và trừ "trước" tv_usec. Bạn không có gì bằng cách đúc một số nguyên của giây cho một phao.

Tôi muốn đề xuất xem trang người đàn ông cho struct timeval.

Đây là mã:

#include <stdio.h> 
#include <sys/time.h> 

int main (int argc, char** argv) { 
    struct timeval tvalBefore, tvalAfter; // removed comma 

    gettimeofday (&tvalBefore, NULL); 
    int i =0; 
    while (i < 10000) { 
     i ++; 
    } 

    gettimeofday (&tvalAfter, NULL); 

    // Changed format to long int (%ld), changed time calculation 

    printf("Time in microseconds: %ld microseconds\n", 
      ((tvalAfter.tv_sec - tvalBefore.tv_sec)*1000000L 
      +tvalAfter.tv_usec) - tvalBefore.tv_usec 
     ); // Added semicolon 
    return 0; 
} 
+0

cảm ơn bạn đã trả lời! Tôi đã quá bất cẩn – mko

+1

"... trang người đàn ông cho 'struct timeval'." Trang người đàn ông là gì? Trên hệ thống của tôi không có trang người đàn ông cho 'struct' hoặc 'timeval'. – neirbowj

+0

Bạn có thể có nó dưới 'man 2 gettimeofday' hoặc' man 3p gettimeofday'. Rõ ràng một số trang có xu hướng được di chuyển xung quanh trong các bản phân phối khác nhau. – LSerni

7

Thay đổi:

struct timeval, tvalBefore, tvalAfter; /* Looks like an attempt to 
              delcare a variable with 
              no name. */ 

tới:

struct timeval tvalBefore, tvalAfter; 

Đó là ít có khả năng (IMO) để làm cho sai lầm này nếu có một tuyên bố duy nhất cho mỗi dòng:

struct timeval tvalBefore; 
struct timeval tvalAfter; 

Nó trở nên dễ bị lỗi hơn khi khai báo con trỏ tới các loại trên một dòng:

struct timeval* tvalBefore, tvalAfter; 

tvalBeforestruct timeval* nhưng tvalAfterstruct timeval.

+0

+1 để đề xuất sử dụng dòng riêng – mko

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