留胡子的鸵鸟 · 2024年安庆桐城市事业单位招聘考点分布图| ...· 4 月前 · |
悲伤的拖把 · 如何看待“康师傅产品有多菌灵”这一说法? - 知乎· 1 年前 · |
想发财的脸盆 · 南阳二全高中部2023招生简章 - 抖音· 1 年前 · |
鬼畜的鼠标 · 祸害天才专业户 - 绑架时间线 - 包子漫画· 1 年前 · |
捣蛋的牙膏 · 一口气看完【武精之魂】我穿越到了斗罗大陆,天 ...· 1 年前 · |
最近在重新编译ijkplayer,并且希望能够打印出来各个阶段的时间,以便对于ijkplayer进一步调优
Linux获取时间有多种方案,都需要添加
#include <time.h>
time
函数获得当前时间,注意单位为秒,其中
time_t
结构体是一个有符号的长整型。
而
ctime
是一个返回格式化好的字符串的指针。格式为
Thu Nov 24 18:22:48 1986\n\0
#include <time.h>
int main()
time_t timep;
time (&timep);
printf(“%s”,ctime(&timep));
return 0;
}
gettimeofday
调用返回来的是一个
timeval
的结构体,其中
tv_sec
是秒数,
tv_usec
是微秒数,通过这两个数共同标志当前时间
#ifndef _STRUCT_TIMEVAL
#define _STRUCT_TIMEVAL struct timeval
_STRUCT_TIMEVAL
__darwin_time_t tv_sec; /* seconds */
__darwin_suseconds_t tv_usec; /* and microseconds */
#endif /* _STRUCT_TIMEVAL */
该函数的使用如下
#include <sys/time.h>
int main(void)
struct timeval time;
gettimeofday(&time, NULL);
printf("Current Time Seconds: %ld,uSeconds:%ld\n", time.tv_sec,time.tv_usec);
return 0;
}
因为在手机上测试的时候,通过
gettimeofday
获取时间,并且通过网上
t.tv_sec*1000+t.tv_usec/1000
来计算毫秒数,结果得到的时间错误。而原因就是32位的系统上,long占四个字节,超出2^32则会溢出,导致结果错误。
比如,当前通过
gettimeofday
获取到的
t.tv_sec
为1534132538,而
t.tv_sec*1000
的结果为8292133328。
原因是:
1534132538的二进制为:
1011011011100010000000100111010
1534132538000的二进制为:
10110010100110001011011001100101010010000
而在32位的机器上,long最多占用32,所以得到的32位二进制如下:
00110001011011001100101010010000
转成10进制就是:
829213328
所以,64位的CPU可以进行该运算,32位的会因为溢出导致值不对
最终的解决方案是,通过long long类型的数据结构来保存,long long 占8个字节,也就是最大值为2^64:
long long gettime(){
struct timeval tv;
gettimeofday(&tv,NULL);
long long seconds=tv.tv_sec; // 先将tv.tv_sec保存成long long类型
return seconds*1000+tv.tv_usec/1000;
}
悲伤的拖把 · 如何看待“康师傅产品有多菌灵”这一说法? - 知乎 1 年前 |
想发财的脸盆 · 南阳二全高中部2023招生简章 - 抖音 1 年前 |
鬼畜的鼠标 · 祸害天才专业户 - 绑架时间线 - 包子漫画 1 年前 |