C語言time.h中clock()函數測程序運行時間

C語言中求程序執行的時間可以使用clock()函數

_CRTIMP clock_t __cdecl __MINGW_NOTHROW clock (void);(可以把它直接視爲clock_t clock(void);)

這個函數返回從“開啓這個程序進程”到“程序中調用clock()函數”時之間的CPU時鐘計時單元(clock tick)數,其中clock_t是用來保存時間的數據類型,

在time.h文件中,我們可以找到對它的定義:

#ifndef _CLOCK_T_DEFINED  
typedef long clock_t;  
#define _CLOCK_T_DEFINED  
#endif  

很明顯,clock_t是一個長整形數。在time.h文件中,還定義了一個常量CLOCKS_PER_SEC,它用來表示一秒鐘會有多少個時鐘計時單元,其定義如下:

#define CLOCKS_PER_SEC ((clock_t)1000)  

可以看到每過千分之一秒(1毫秒),調用clock()函數返回的值就加1。
下面給出一個示例:

#include <stdio.h>  
#include <stdlib.h>  
#include <time.h>  

int main()  
{  
    long i=10000000L;  
    clock_t start,finish;  
    double TheTimes;  
    printf("做%ld次空循環需要的時間爲",i);  
    start=clock();  
    while(i--);  
    finish=clock();  
    TheTimes=(double)((finish-start)/CLOCKS_PER_SEC);  
    printf("%f秒。\n",TheTimes);  
    return 0;  
} 

可是運行完每次的結果都爲:

10000000次空循環需要的時間爲0.000000秒。  

Process returned 0 (0x0)   execution time : 0.438 s  
Press any key to continue. 

加大循環次數也不行。
最後終於找到的問題所在:

#include <stdio.h>  
#include <stdlib.h>  
#include <time.h>  

int main()  
{  
    long i=10000000L;  
    clock_t start,finish;  
    double TheTimes;  
    printf("做%ld次空循環需要的時間爲",i);  
    start=clock();  
    while(i--);  
    finish=clock();  
    TheTimes=(double)(finish-start)/CLOCKS_PER_SEC; //紅色語句
    printf("%f秒。\n",TheTimes);  
    return 0;  
}  

看紅色行和上面的區別,現在明白了吧!是由於括號運算符改變了運算的優先級,將裏面的四則運算變成了整數之間的除法,造成位數被捨去,造成的誤差。
看來細節還是很重要的。
寫出來和大家分享。

轉載地址:http://blog.csdn.net/wangluojisuan/article/details/7043667

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章