1. 程式人生 > >關於標準c++ 利用clock()函式計算時間為負值原因及解決

關於標準c++ 利用clock()函式計算時間為負值原因及解決

由於沒有在windows的環境下,所以在計算程式執行時間時不能利用GetTickCount()函式,在標準c++下計算時間的資料在網上也出現許多,比較詳細的我可以推薦yunyin86的《linux 計算程式執行時間》一文,講的很詳細。於是我用了clock()函式來計算時間,由於程式比較大,執行的時間比較長,但每次執行完這後得到的結果都是負數,有些不解,查些資料後才明白了,原來clock_t是long型,其取值範圍是-2147483648~2147483648,利用clock()函式取得的時間最大值為2147483648 / 1000000 = 2147.483647s,大約為35.79分鐘,也就是說利用clock()函式只能記錄的執行時間不超過這麼多的程式,如果程式執行時間過長,資料就會逸出。要想計算更長的時間需要用gettimeofday()函式,些函式在sys/time.h標頭檔案中,使用時要引用這個標頭檔案,而不是time.h的標頭檔案。

關於gettimeofday()的使用,我就不多講了,它的功能是查詢系統時鐘,以確定當前的日期和時間

原型為:

struct timeval
{
     long tv_sec;//秒域
     long tv_usec;//微秒域
}
int getimeofday(struct timeval* tv,NULL);
計算時間可以精確到微秒,而且得到的時間最大值為2147483648 + 2147483648/1000000 = 2147485794.483647 s,大約為68.096年。這麼長的時間計算一般的大程式也應該夠了吧。

關於函式的使用程式碼給出:

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

int main(int argc,char* argv[])
{
     //記錄時間
     struct timeval start,finish;
     gettimeofday(&start,NULL);
     double totaltime = 0.0;

     ...//你要執行的程式碼
    
     gettimeofday(&finish,NULL);
     Totaltime = finish.tv_sec - start.tv_sec + (finish.tv_usec - start.tv_usec) / 1000000.0;

     std::cout<<"程式執行時間為:"<<Totaltime<<std::endl;
      return 0;
     
}

希望有所幫助。