免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 55529 | 回复: 17
打印 上一主题 下一主题

[函数] 请教一个关于gettimeofday函数的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-02-12 10:30 |只看该作者 |倒序浏览
我用gettimeofday在linux(2.4.21-37.ELsmp)上计算时间差,下面是部分代码

                struct timeval tvStart,tvEnd;
                double linStart = 0,linEnd = 0,lTime = 0;


                gettimeofday (&tvStart,NULL);
//do something
                gettimeofday (&tvEnd,NULL);  

                linStart = ((double)tvStart.tv_sec * 1000000 + (double)tvStart.tv_usec);  //unit S
                linEnd = ((double)tvEnd.tv_sec * 1000000 + (double)tvEnd.tv_usec);        //unit S
                lTime = linEnd-linStart;
                if(lTime <= 0)
               {
                        .......
               }

但是会几率性出现l(概率很低)Time小于0的现象(有一次为-1448997.000000);我google了一下gettimeofday函数也有人反映这个问题,但是苦于我e文不好没找到解决方法....
请教各位大牛,这是不是我的程序写的有问题?

[ 本帖最后由 haohao06 于 2007-2-12 10:39 编辑 ]

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
2 [报告]
发表于 2007-02-12 13:03 |只看该作者
错了.gettimeofday里边是一块静态内存.

论坛徽章:
0
3 [报告]
发表于 2007-02-12 13:55 |只看该作者
原帖由 cookis 于 2007-2-12 13:03 发表
错了.gettimeofday里边是一块静态内存.

shan chu

[ 本帖最后由 soul_of_moon 于 2007-2-12 14:22 编辑 ]

论坛徽章:
2
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:56:11
4 [报告]
发表于 2007-02-12 14:02 |只看该作者
我觉得是跨午夜问题。

论坛徽章:
0
5 [报告]
发表于 2007-02-12 14:22 |只看该作者
引用别人的:
"并且,有人曾经做过测试,连续两次使用gettimeofday时,会以一种小概率出现"时光倒流"的现象,第二次函数调用得到的时间要小于或说早于第一次调用得到的时间。gettimeofday函数并不是那么稳定,没有times或clock计时准确,但它们用法相似。clock有计时限制,据说是 596.5+小时,一般情况足以应付。"

论坛徽章:
0
6 [报告]
发表于 2007-02-12 14:46 |只看该作者
下面是google论坛上的回复.不过按照他的说法以及楼上大哥的解释,lTime应该不至于误差这么大啊(1.4s之多);
我比较倾向于double类型溢出.但是经我试验好像不会溢出.而且连续运行多次不应该出现有时溢出有时不溢出;

谢谢各位的帮助.

On Feb 11, 7:06 pm, yuanhao1...@gmail.com wrote:

> I hope someone can help me with negative time measurements
> I am
> getting.
Surely i'm doing something silly but cannot find it.

> code:
>                 struct timeval tvStart,tvEnd;
>                 double linStart = 0,linEnd = 0,lTime = 0;

>                 gettimeofday (&tvStart,NULL);

You are using the wrong function. The 'gettimeofday' function gets the
system's best guess at wall time. This *can* go backwards. What you
want is 'clock_gettime(CLOCK_MONOTONIC)' which measures the elaspsed
time from an arbitrary reference time. (Usually the system uptime, but
that's not guaranteed.)

DS

[ 本帖最后由 haohao06 于 2007-2-12 14:56 编辑 ]

论坛徽章:
0
7 [报告]
发表于 2007-02-12 15:00 |只看该作者
原帖由 haohao06 于 2007-2-12 14:46 发表
下面是google论坛上的回复.不过按照他的说法以及楼上大哥的解释,lTime应该不至于误差这么大啊(1.4s之多);
我比较倾向于double类型溢出.但是经我试验好像不会溢出.而且连续运行多次不应该出现有时溢出有时不溢出; ...

我一开始就认为是溢出,但是试了一下没有,所以删除了

论坛徽章:
0
8 [报告]
发表于 2007-04-09 23:01 |只看该作者
相撞gettimeofday,此问题我出现过。后改用long long 无负数的情况出现。。。

论坛徽章:
0
9 [报告]
发表于 2009-06-11 00:06 |只看该作者

回复 #1 haohao06 的帖子

楼主code写得不好,容易出现double溢出或者有效位数不足。因为tvStart.tv_sec * 1000000可能比tvStart.tv_usec大很多。
可以写成这样:
int timespend = 1000000*(tvEnd.tv_sec-tvStart.tv_sec) + (tvEnd.tv_usec-tvStart.tv_usec);
如果(tvEnd.tv_sec-tvStart.tv_sec)不是很大(小于十几分钟),那么用int乘法和加法就足够了,否则可以用long long或者double型。

或者像楼上所说,直接用long long型,
long long tStart = (long long)1000000*tvStart.tv_sec+tvStart.tv_usec;
long long tEnd = (long long)1000000*tvEnd.tv_sec+tvEnd.tv_usec;
long long spend = tEnd - tStart;

[ 本帖最后由 fbcome 于 2009-6-11 10:09 编辑 ]

论坛徽章:
0
10 [报告]
发表于 2009-06-11 15:00 |只看该作者
你的程序没有考虑跨夜的情况,这个函数获取的是一天内的时间流失多少
如果程序运行时跨夜了就有可能后面取的时间值比前面的还小
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP