做用: 須要打印代碼執行到某處的時間,或者須要計算程序執行的時間差(精確到微妙級)。這時會用到gettimeofday函數,它能夠返回自1970-01-01 00:00:00到如今經歷的秒數。linux
原型:函數
int gettimeofday(struct timeval *tv, struct timezone *tz)
所需頭文件:code
#include <sys/time.h>
參數說明:get
struct timeval:原型
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個字節,能夠用到幾千億年,這麼長的時間徹底不用擔憂溢出的問題。float
在利用tv_sec和tv_usec計算毫秒數時,須要注意溢出的問題:程序
struct timeval tv; gettimeofday(&tv, NULL); long long ts = (long long)tv.tv_sec*1000 + tv.tv_usec/1000;
注意了其中的(long long)類型轉換對於32位的系統是必須的,不然乘上1000會溢出。有些人可能沒有注意到這個問題,由於溢出後計算出來的值也是隨時間遞增的,並且計算一段時間差也是對的。但嚴謹的工程師都應該注意到因字長不足致使的溢出錯誤。im
struct timezone:類型轉換
struct timezone{ int tz_minuteswest;/*格林威治時間往西方的時差*/ int tz_dsttime;/*DST 時間的修正方式*/ }
timezone 參數若不使用則傳入NULL便可。 在一段代碼先後分別使用gettimeofday能夠計算代碼執行時間:文件
#include <assert.h> #include <sys/time.h> int main() { float time_use=0; struct timeval start; struct timeval end; gettimeofday(&start,NULL); printf("start.tv_sec:%dn",start.tv_sec); printf("start.tv_usec:%dn",start.tv_usec); fun(); time_use=(end.tv_sec-start.tv_sec)*1000000+(end.tv_usec-start.tv_usec);//微秒 printf("time_use is %fn us",time_use); }