關於標準c++ 利用clock()函式計算時間為負值原因及解決
阿新 • • 發佈:2019-01-30
由於沒有在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; }
希望有所幫助。