MATLAB的tic-toc与C的clock函数不一致

8

我写了一些C代码,在使用MEX编译之后,我会从MATLAB中调用它。在C代码内部,我使用以下代码测量计算的一部分所需的时间:

clock_t begin, end;
double time_elapsed;
begin = clock();
/* do stuff... */
end = clock();
time_elapsed = (double) ((double) (end - begin) / (double) CLOCKS_PER_SEC);

执行时间应以秒为单位计算。我将值“time_elapsed”输出到MATLAB(已正确导出,我进行了检查)。然后,在MATLAB端,我调用此C函数(在使用MEX编译后),并使用“tic”和“toc”来测量其执行时间。令人完全不可思议的是,使用“tic”和“toc”计算的时间为0.0011秒(500次运行的平均值,标准偏差为1.4e-4),而由C代码返回的时间为0.037秒(500次运行的平均值,标准偏差为0.0016)。
这里可以注意到两个非常奇怪的事实:
1.整个函数的执行时间低于代码一部分的执行时间。因此,要么MATLAB的测量不准确,要么C测量不准确。
2.C代码中测得的执行时间非常散乱,并且表现出非常高的标准偏差(变异系数为44%,而tic-toc仅为13%)。
这些计时器到底怎么了?

时钟的分辨率是多少?我们怎么知道begin = clock();是在一个时钟周期之前还是之后执行的?这会影响结果吗?很可能会。 - Bo Persson
@BoPersson,你的意思是说clock()最多可能会错过一次计时吗? - Pantelis Sopasakis
4
我的意思是一个滴答声可能足够大,会影响结果。例如18毫秒。 - Bo Persson
3
检验这个假设的简单方法是将 /* do stuff */ 放入一个循环中。另外,参考这篇文章:https://dev59.com/8HRB5IYBdhLWcg3wj32c 有关于 clock() 分辨率的内容。 - s.bandara
1个回答

6
你正在比较苹果和橙子。
看一下Matlab的文档: tic - http://www.mathworks.com/help/matlab/ref/tic.html
toc - http://www.mathworks.com/help/matlab/ref/toc.html tictoc 可以让您测量实际经过的时间。
现在看看 clock 函数 http://linux.die.net/man/3/clock
特别是,

clock()函数返回程序使用的处理器时间的近似值。

返回的值是一个clock_t类型的CPU已使用时间; 要获取所使用的秒数,需除以CLOCKS_PER_SEC。如果无法获得使用的处理器时间或其值不能表示,则该函数返回值(clock_t) -1。

那么你的差异可能是由什么造成的:

  • CPU时间(由clock()测量)和实际经过的时间(由tic和toc测量)并不相同。所以你会期望CPU时间比经过的时间少?嗯,也许吧。如果在0.0011秒内你正在以100%的速度驱动10个核心,那么clock()测量值将是使用tic和toc测量值的10倍。这是可能的,但不太可能。
  • clock(.)非常不准确,并且与文档一致,它是一种近似的CPU时间测量!我怀疑它被钉在了调度器量子大小上,但我没有挖掘Linux内核代码进行检查。我也没有在其他操作系统上进行检查,但this dude's blog与该理论一致。

那么该怎么办呢...首先,要将苹果与苹果进行比较!其次,请确保考虑计时器分辨率。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接