作用:需要打印代码执行到某处的时间,或者需要计算程序执行的时间差(精确到微妙级)。这时会用到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