gettimeofday是glibc的一个库函数,最高支持获取从微秒级精度。
函数获取到的是一个结构体,具体如下。
int gettimeofday(struct timeval*tv, struct timezone *tz);
gettimeofday可以获得1970年1月1日0点到现在的时间和当前时区。
会把时间存进结构体timeval
struct timeval{ long int tv_sec; // 秒数 long int tv_usec; // 微秒数 }
时区结构体 timezone
struct timezone{ int tz_minuteswest;/*格林威治时间往西方的时差*/ int tz_dsttime;/*DST 时间的修正方式*/ }
通常在执行一段函数前后各调用一遍gettimeofday,再相减得到的差就是函数执行时间。
如果仅仅相减求时间,可以不用时区参数,将时区参数置NULL即可。
秒数和微秒数,均用long int类型储存。
实际使用代码示例
c语言版:
用gettimeofday()可获得微妙级(0.000001秒)的系统时间,调用两次gettimeofday(),前后做减法,从而达到定时或者计算时间的目的。
原型:int gettimeofday(struct timeval *tv,struct timezone *tz),会把目前的时间tv所指的结构返回,当地时区的信息则放到tz所指的结构中。这两个结构都放在/usr/include/sys/time.h 中。
#include #include //malloc要用,没有的话,会有警告信息:隐式声明与内建函数'malloc'不兼容。不过警告信息不用管也没事 #include #include int main() { float time_use=0; struct timeval start; struct timeval end;//struct timezone tz; //后面有说明 gettimeofday(&start,NULL); //gettimeofday(&start,&tz);结果一样 printf("start.tv_sec:%dn",start.tv_sec); printf("start.tv_usec:%dn",start.tv_usec); sleep(3); gettimeofday(&end,NULL); printf("end.tv_sec:%dn",end.tv_sec); printf("end.tv_usec:%dn",end.tv_usec); time_use=(end.tv_sec-start.tv_sec)*1000000+(end.tv_usec-start.tv_usec);//微秒 //这里是要把秒数乘以10^6的,因为微妙也是用long int储存的,结果是微秒。 printf("time_use is %fn",time_use); //输出:time_use is 3001410.000000
//下面的采用指针的方式也可以,但是要注意指针类型若不分配内存的话,编译正确,但是运行结果会不对 struct timeval *start; struct timeval *end; //struct timezone *tz; start=(struct timeval *)malloc( sizeof(struct timeval) ); assert(start!=NULL); end=(struct timeval *)malloc( sizeof(struct timeval) ); assert(start!=NULL); gettimeofday(start,NULL);//gettimeofday(start,tz); printf("start->tv_sec:%dn",start->tv_sec); //printf("(*start).tv_sec:%dn",(*start).tv_sec);一样 printf("start->tv_usec:%dn",start->tv_usec); //printf("tz->tz_minuteswest:%dn",tz->tz_minuteswest); //printf("tv->tz_dsttime:%dn",tz->tz_dsttime); sleep(3); gettimeofday(end,NULL);//gettimeofday(end,tz); printf("end->tv_sec:%dn",end->tv_sec); printf("end->tv_usec:%dn",end->tv_usec); time_use=(end->tv_sec-start->tv_sec)*1000+(end->tv_usec-start->tv_usec)/1000;//毫秒 //之类tv_sec*1000+tv_usec/1000,结果是毫秒。 printf("time_use is %fn",time_use); //输出:time_use is 3001.000000 struct timeval { time_t tv_sec; // seconds suseconds_t tv_usec; // 微妙10^6s }; struct timezone { int tz_minuteswest;//和格林威治时间差了多少分钟 int tz_dsttime; //日光节约时间的状态 } //tz_dsttime 所代表的状态如下 DST_NONE /*不使用*/ DST_USA /*美国*/ DST_AUST /*澳洲*/ DST_WET /*西欧*/ DST_MET /*中欧*/ DST_EET /*东欧*/ DST_CAN /*加拿大*/ DST_GB /*大不列颠*/ DST_RUM /*罗马尼亚*/ DST_TUR /*土耳其*/ DST_AUSTALT /*澳洲(1986年以后)*/ }