关于unix/linux平台下通用的获取时间函数gettimeofday

ios开发 myhloli 19074次浏览 已收录 8个评论

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年以后)*/
}
  萝莉社,版权所有丨如未注明,均为原创丨本网站采用BY-NC-SA协议进行授权,转载请注明转自:https://myhloli.com/gettimeofday.html
喜欢 (40)
发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
(8)个小伙伴在吐槽
  1. 学习了,支持一个![围观]
    爆实惠2015-11-21 19:57 回复
  2. 逛逛。。。
    abcoco2015-10-05 13:44 回复
  3. why?2015-09-27 21:23 回复
  4. 萝莉,一听就是小妹妹的嘛
    孤军奋战2015-09-12 11:17 回复
  5. 雪鹰领主2015-09-08 23:03 回复
  6. 这是你自己写的吗?
    1232015-09-07 14:37 回复
  7. 过来看看,支持一下
    朱海涛博客2015-09-01 23:58 回复
  8. 雁过留声,人过留名,我是小灰灰,欢迎互访。https://www.fifiblog.com
    小灰灰2015-08-28 16:38 回复
加载中……