作用:需要打印代碼執行到某處的時間,或者需要計算程序執行的時間差(精確到微妙級)。這時會用到gettimeofday函數,它可以返回自1970-01-01 00:00:00到現在經歷的秒數。
#include <sys/time.h>
int gettimeofday(struct timeval *tv, struct timezone *tz)
參數說明:
struct timeval
{ long int tv_sec; // 秒數 long int tv_usec; // 微秒數
}
其中time_t和suseconds_t都是long int類型。在32位下為4個字節,能夠表示的最大正整數是2147483647,而這個表示的時間最大能到2038-01-19 03:14:07,超過了之后就變為-2147483648,這就是linux2038年的問題。而64位系統下的time_t類型即long類型長度為8個字節,可以用到幾千億年,這么長的時間完全不用擔心溢出的問題。
在利用tv_sec和tv_usec計算毫秒數時,需要注意溢出的問題:
注意了其中的(long long)類型轉換對于32位的系統是必須的,否則乘上1000會溢出。有些人可能沒有注意到這個問題,因為溢出后計算出來的值也是隨時間遞增的,而且計算一段時間差也是對的。但嚴謹的工程師都應該注意到因字長不足導致的溢出錯誤。
struct timezone:
struct timezone
{ int tz_minuteswest;/*格林威治時間往西方的時差*/ int tz_dsttime; /*DST 時間的修正方式*/
}
timezone 參數若不使用則傳入NULL即可。
在一段代碼前后分別使用gettimeofday可以計算代碼執行時間:
#include <assert.h>
#include <unistd.h>
#include <stdio.h>
#include <sys/time.h>// 1秒等于1000毫秒,等于1000000微秒
int main()
{float time_use = 0;struct timeval start;struct timeval end;gettimeofday(&start, NULL);printf("start.tv_sec:%d\n", start.tv_sec);printf("start.tv_usec:%d\n", start.tv_usec);gettimeofday(&end, NULL);time_use = (end.tv_sec - start.tv_sec) * 1000000 + (end.tv_usec - start.tv_usec);//微秒printf("time_use is %f us \n", time_use);
}
輸出結果:
參考資料:
- gettimeofday