gettimeofday

做用: 須要打印代碼執行到某處的時間,或者須要計算程序執行的時間差(精確到微妙級)。這時會用到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);
}
相關文章
相關標籤/搜索