Linux下gettimeofday函数
2020年6月8日16点33分
函数头文件及原型为:
#include<sys/time.h>
int gettimeofday(struct timeval*tv,struct timezone *tz )
参数:
struct timeval{
long tv_sec;/*秒*/
long tv_usec;/*微妙*/
};
struct timezone{
int tz_minuteswest;/*和greenwich时间差*/
int tz_dsttime;
}
习惯用法:
struct timeval start;
gettimeofday(&start,NULL);
printf("time is %ld ms\n", start.tv_sec*1000 + start.tv_usec/1000);
后面可以再声明一个类似的end参数,通过end与start相减,可以获得两次调用gettimeofday函数之间代码执行的时间。
注意点
以上代码在64位linux下执行正常,在32位linux嵌入式设备上执行结果有问题,可能是32位与64位系统中,long类型能够保存的数据长度不同导致。
32位系统中long占4个字节,64位系统中long占8个字节。
若想在32位linux嵌入式设备上正常获取毫秒级时间戳,需要加上强制类型转换,如下所示:
struct timeval start;
gettimeofday(&start,NULL);
printf("time is %lld ms\n", (long long)(start.tv_sec)*1000 + (long long)(start.tv_usec)/1000);
获取函数执行时间示例
struct timeval start, end;
gettimeofday(&start,NULL);
myfun();
gettimeofday(&end,NULL);
//以整数显示微秒
printf("use %lld us\n", (long long)(end.tv_sec-start.tv_sec)*1000*1000 + (long long)(end.tv_usec-start.tv_usec));
//以整数显示毫秒
printf("use %lld ms\n", (long long)(end.tv_sec-start.tv_sec)*1000 + (long long)(end.tv_usec-start.tv_usec)/1000);
//以浮点数显示毫秒
printf("use %lf ms\n", ((long long)(end.tv_sec-start.tv_sec)*1000*1000 + (long long)(end.tv_usec-start.tv_usec))*1.0/1000);