Linux中獲得程式時間的函式
精確一點的是用gettimeofday(),不精確的可以用clock();
1、gettimeofday()函式
1.簡介:
在C語言中可以使用函式gettimeofday()函式來得到時間。它的精度可以達到微妙
2.函式原型:
#include<sys/time.h>
int gettimeofday(struct timeval*tv,struct timezone *tz )
3.說明:
gettimeofday()會把目前的時間用tv 結構體返回,當地時區的資訊則放到tz所指的結構中
4.結構體:
1>timeval
struct timeval{
long tv_sec;/*秒*/
long tv_usec;/*微妙*/
};
2>timezone 結構定義為:
struct timezone{
int tz_minuteswest;/*和greenwich 時間差了多少分鐘*/
int tz_dsttime;/*type of DST correction*/
}
3>在gettimeofday()函式中tv或者tz都可以為空。如果為空則就不返回其對應的結構體。
4>函式執行成功後返回0,失敗後返回-1,錯誤程式碼存於errno中。
5.程式例項:
#include<stdio.h>
#include<sys/time.h>
#include<unistd.h>
int main()
{
struct timeval tv;
struct timezone tz;
gettimeofday(&tv,&tz);
printf(“tv_sec:%d\n”,tv.tv_sec);
printf(“tv_usec:%d\n”,tv.tv_usec);
printf(“tz_minuteswest:%d\n”,tz.tz_minuteswest);
printf(“tz_dsttime:%d\n”,tz.tz_dsttime);
}
說明:在使用gettimeofday()函式時,第二個引數一般都為空,因為我們一般都只是為了獲得當前時間,而不用獲得timezone的數值
二.gettimeofday()函式的一個常用方法
在測試程式時,往往需要了解程式執行所需的時間,在Linux中可以使用函式gettimeofday來得到時間.
1.程式例項:
測試呼叫delya()函式所需執行的時間(單位為微妙)
#include<stdio.h>
#include<sys/time.h>
#include<unistd.h>
int delay(int time)
{
int i,j;
for(i =0;i<time;i++)
for(j=0;j<5000;j++)
;
}
int main()
{
struct timeval start;
struct timeval end;
unsigned long diff;
gettimeofday(&start,NULL);
delay(10);
gettimeofday(&end,NULL);
diff = 1000000 * (end.tv_sec-start.tv_sec)+ end.tv_usec-start.tv_usec;
printf(“thedifference is %ld\n”,diff);
return 0;
}
說明:
使用該方法就可以檢測出呼叫delay()函式所使用的時間
C語言中可以使用函式gettimeofday()函式來得到時間。它的精度可以達到微妙
clock()
clock()的精度不是很高
clock_t clock( void );
clock()函式返回從“開啟這個程式程序”到“程式中呼叫clock()函式”時之間的CPU時鐘計時單元(clock tick)數,在MSDN中稱之為掛鐘時間(wal-clock),其中clock_t實際上是長整型。在time.h檔案中,還定義了一個常量CLOCKS_PER_SEC,它用來表示一秒鐘會有多少個時鐘計時單元:#define CLOCKS_PER_SEC ((clock_t)1000)。可以使用公式clock()/CLOCKS_PER_SEC來計算一個程序自身的執行時間,eg:
printf("Elapsed time:%u secs.\n", clock()/CLOCKS_PER_SEC);
以上C/C++下的時間函式需包含time.h標頭檔案
計時 C/C++中的計時函式是clock(),而與其相關的資料型別是clock_t。在MSDN中,查得對clock函式 定義如下: clock_t clock( void ); 這個函式返回從“開啟這個程式程序”到“程式中呼叫clock()函式”時 之間的CPU時鐘計時單元(clock tick)數,在MSDN中稱之為掛鐘時間(wall-clock)。其中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。 下面舉個例子,你可以使用公式 clock()/CLOCKS_PER_SEC來計算一個程序自身的執行時間: void elapsed_time() { printf("Elapsed time:%u secs./n",clock()/CLOCKS_PER_SEC); } 當然,你也可以用clock函式來計算你的機器執行一個迴圈或者處理其它事件到底花了多少時間: #i nclude “stdio.h” #i nclude “stdlib.h” #i nclude “time.h” int main( void ) { long i = 10000000L; clock_t start, finish; double duration; printf( "Time to do %ld empty loops is ", i ); start = clock(); while( i-- ) ; finish = clock(); duration = (double)(finish - start) / CLOCKS_PER_SEC; printf( "%f seconds/n", duration ); system("pause"); } 在筆者的機器上,執行結果如下: Time to do 10000000 empty loops is 0.03000 seconds 上面我們看到時鐘計時單元的長度為1毫秒,那麼計時的精度也為1毫秒, 那麼我們可不可以通過改變CLOCKS_PER_SEC的定義,通過把它定義的大一些, 從而使計時精度更高呢? 通過嘗試,你會發現這樣是不行的。 在標準C/C++中,最小的計時單位是一毫秒。