最近和同事讨论代码碰到一个问题: 没有办法精确地统计出代码的运行时间。
用的 clock, times 等精度不够,我们用了循环把量放大的方法[*]。
但又有新问题,多次运行的时间不一致。怀疑是碰到系统的调度了。
请问有什么方法、手段可以精确统计一段代码的运行时间?
--
You received this message because you are subscribed to the Google Groups "Chengdu Linux User Group" group.
To post to this group, send email to cdlug_c...@googlegroups.com.
To unsubscribe from this group, send email to cdlug_communi...@googlegroups.com.
For more options, visit this group at http://groups.google.com/group/cdlug_community?hl=en.
>要多精确呢?
我想要的是精确,是指单位尽量小。比如一条指令的差别也能表示出来。
> 系统调度肯定不可避免的吧,通过多次计时求平均值这样算比较精确吧。
如果最小的差别由于精度不够,根本没有统计上,多次运行求平均就没有意义了。
比如差别只在1个时钟周期,然后统计的方法精确度只到 ms,差别根本就被略掉了。
> 再说任何代码最后都是运行到具体的机器不是?
是的.
理想情况的是最后计算出来的单位是例如时钟周期这样的,机器无关的单位。
通过在网上搜索, 586 以上 x86 有一条指令: RDTSC 可以取得 CPU 复位到当前的时钟周期数,
这条指令的描述看起很不错.
但同样存在*多次运行结果不稳定*(仍然怀疑是系统调度引起)的问题,没有办法解决。
RDTSC 调用指令本身带来的影响是在同一平台上应该是一个常量,如果解决了稳定结果的问题,这个问题就搞定了。
上面是运行时确定的方法,
另外我们还在想了一套静态确定的方法:
把目标平台的每条指令需要的时钟周期数列在一个表中
把代码编译输出的指令到表中查找,并累计
比较最后的结果。
通过不运行来绕开,运行时的调度,从而避免*多次运行结果不稳定*
不知道这种思路有没有现成的实现!
如果自己去实现,搞到前面这条表都是个体力活啊。