超级高手请进,小弟很头疼,非常困惑。希望能有高手给一个比较好的分析。
时间:2008-05-22 07:59:43
来源:论坛整理 作者: 编辑:chinaitzhe
现象如下。
现在测试一个函数的执行时间,时间单位为毫秒(ms)
通常取得的时间都为0。
但因为是核心代码,执行次数非常多,大约每执行1万-3万次,就会出现一个16ms的时间。
提问,为什么会有一个16ms这样大的一个时间出现?
并且所有得出的时间数据里面,只有0,和16这两个时间。
一般来说,会有什么样的可能呢???
我现在非常困惑,非常头疼。
望高手能给与帮助。
谢谢。
网友回复:函数执行时间 你是怎么测的?
网友回复:我觉得,cpu是有时钟频率的,可能是用了多少帧,最后算出来16ms,还是要看具体实现
这是我的愚见哈,不知道对不对。
网友回复:GetProcessTimes(GetCurrentProcess(), &ftDummy,&ftDummy, &ftKernelTimeStart, &ftUserTimeStart);
GetThreadTimes(GetCurrentThread(), &ftDummy,&ftDummy, &ftKernelTimeStart, &ftUserTimeStart);
用上面这两组函数看看,纳秒级别的.
进入函数时测一次,退出函数时测一次.
网友回复:
因为你的测试不够精确
网友回复:哦对不起,忘记说了
我是用clock()函数取得系统时间。
另外,我的工程没有使用MFC类库。
关于我的测试精确问题,我想不用讨论了。
即便是 1ms,与16ms的时间差值也是非常大的。
而且在测试中,这个函数的调用条件是完全一致的。
我想知道的就是,什么情况可能导致效率的骤然下降如此大的幅度呢?
网友回复:不要以为clock()返回的是毫秒就以为它的精度是1ms,不是这么回事的,这个精度在我的机器上是10ms的,看起来你的机器上的精度是16ms
网友回复:现在的CPU都非常快!
例如主频3G的Inter CPU 一秒钟可以执行 30 亿条加法指令,所以一毫秒的时间足够它执行 300万条加法指令了。
假如你的函数不是极其复杂,你又用毫秒为单位来度量它的执行时间,当然是 0 了。 那并不表示执行你的代码不花时间,只是表示完成你的代码所需时间小于1毫秒。
现在的操作系统都是多任务操作系统,他可以在一个任务没有完成时就切换到另一个任务去执行,然后又切换回这个任务来接着执行。你检测到的16ms就说明你的函数在执行期间碰到任务切换了。
假如所有得出的时间数据里面,只有0 和16这两个时间说明你的电脑很清闲,它除了运行你的程序外几乎什么也不做,只是有规律地去执行一些基础的系统任务。
假如你想获得更多的时间数据,你可以多运行点程序,比如运行一个3D游戏、或放着一部电影,同时测试你的程序,你就会采到各种各样的数据。因为CPU忙起来了,切换的可能性就大多了,而且每次切换花的时间也会不一样。
网友回复:有操作系统提供的精确时间计算API,查一下吧,一般都没用这么精确的测算
网友回复:因为你用了GetTickCount之类的精度过低的测量时间的方法.
假如你需要ms级的精度, timeGetTime()勉强可以应付, 假如你需要更高级别的, 就用QueryPerformance吧.
网友回复:也可以算总时间
- C/C code
Code highlighting produced by Actipro CodeHighlighter (freeware) http://www.CodeHighlighter.com/ void f() { static int times = 0; if (times % 1000 == 0) cout<<cost,times = 0,cost = 0; start = clock(); ... if (clock() - start < 1ms) cost = clock() - start, times; }
网友回复: 顶
顶
网友回复:Java已经提供纳秒级的时候了, 不知道C 标准库什么时候会提供.
网友回复:
标准库中连Sleep还都没有
关键字:超级,高手,请进,小弟,头疼,
下一篇:下面没有链接了











文章评论
共有 0 位网友发表了评论 此处只显示部分留言 点击查看完整评论页面