2012-10-04 65 views
6

閱讀this article大約經過時間後,我寫了一個簡單的代碼來計算一個循環的執行時間:如何使用struct timeval來獲取執行時間?

#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; 
} 

鐺編譯器給了我以下錯誤:

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. 

我不能找出我的代碼有什麼問題,有什麼想法?

+2

取出,經過「timeval結構」 – LSerni

+3

逗號不要使用gettimeofday的測量執行時間!閱讀此:http://blog.habets.pp.se/2010/09/gettimeofday-should-never-be-used-to-measure-time和此:http://stackoverflow.com/questions/12392278/getrusage -vs-clock-gettime-vs-clock-vs-gettimeofday/12480485#12480485 –

+1

@ DouglasB.Staple感謝你讓我知道這個問題 – mko

回答

18

你在你的代碼兩次打字錯誤:

struct timeval, 

應該

struct timeval 

printf()括號後,你需要一個分號。

另外,根據編譯器的不同,如此簡單的循環可能會被優化,無論您做什麼,都會給您一個0微秒的時間。

最後,時間計算是錯誤的。你只考慮秒數,忽略微秒。您需要獲得秒之差,乘以100萬,然後在「tv_usec之後」並在「tv_usec之前」減去「之後」。通過將一整數秒的時間轉換爲浮點數,您無所裨益。

我建議查看struct timeval的手冊頁。

這是代碼:

#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

謝謝你的回答!我很粗心 – mko

+1

「...'struct timeval'的手冊頁。」那是什麼人的網頁?在我的系統上沒有'結構'或'timeval'的手冊頁。 – neirbowj

+0

您可能在「man 2 gettimeofday」或「man 3p gettimeofday」下面有它。顯然,幾個聯機手冊傾向於在不同的發行版中移動。 – LSerni

7

變化:

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

到:

struct timeval tvalBefore, tvalAfter; 

這是不太可能的(IMO)犯這個錯誤,如果有每行一個聲明:

struct timeval tvalBefore; 
struct timeval tvalAfter; 

它在單行上聲明指向類型的指針時變得更容易出錯:

struct timeval* tvalBefore, tvalAfter; 

tvalBeforestruct timeval*,但tvalAfterstruct timeval

+0

+1建議使用單獨行 – mko

相關問題