超级高手请进,小弟很头疼,非常困惑。希望能有高手给一个比较好的分析。

时间: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);

用上面这两组函数看看,纳秒级别的.
进入函数时测一次,退出函数时测一次.
网友回复:
引用楼主 alvinsn 的帖子:
最近在调查项目中执行效率的一个问题。
现象如下。

现在测试一个函数的执行时间,时间单位为毫秒(ms)
通常取得的时间都为0。
但因为是核心代码,执行次数非常多,大约每执行1万-3万次,就会出现一个16ms的时间。

提问,为什么会有一个16ms这样大的一个时间出现?
并且所有得出的时间数据里面,只有0,和16这两个时间。

一般来说,会有什么样的可能呢???

我现在非常困惑,非常头疼。
望高手能给与帮…

因为你的测试不够精确
网友回复:哦对不起,忘记说了
我是用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 标准库什么时候会提供.
网友回复:
引用 12 楼 Inhibitory 的回复:
Java已经提供纳秒级的时候了, 不知道C 标准库什么时候会提供.

标准库中连Sleep还都没有
关键字:超级,高手,请进,小弟,头疼,

文章评论

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