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);
}
相关文章
相关标签/搜索