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年以后)*/
}