我编写了一些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进行编译之后),并使用tictoc衡量其执行时间。完全荒谬的是,我使用tic和toc计算的时间是0.0011s(500次运行的平均值,st。dev。1.4e-4),而C代码返回的时间是0.037s(平均500次运行,标准偏差0.0016)。

在这里,您可能会注意到两个非常奇怪的事实:
  • 整个函数的执行时间比部分代码的执行时间短。因此,无论是MATLAB还是C的测量都是非常不准确的。
  • 在C代码中测量的执行时间非常分散,并且显示出很高的st。偏差(变异系数为44%,而tic-toc仅为13%)。

  • 这些计时器是怎么回事?

    最佳答案

    您正在将苹果与橙子进行比较。

    查看Matlab的文档:

    tic-http://www.mathworks.com/help/matlab/ref/tic.html
    toc-http://www.mathworks.com/help/matlab/ref/toc.html

    tic和toc可让您测量实际耗时。

    现在看一下时钟函数http://linux.die.net/man/3/clock

    特别是,



    那么,什么可以解释您的差异:

  • CPU时间(由clock()度量)和实际耗时(由tic和toc度量)不相同。因此,您希望CPU时间比耗时短吗?也许。如果您在0.0011秒内以100%的速度驱动10个内核怎么办?这意味着clock()测量值是使用tic和toc测量的10倍。可能,不太可能。
  • clock(.)非常不准确,并且与文档一致,它是近似 cpu时间的度量值!我怀疑它与调度程序的量子大小有关,但是我没有深入研究Linux内核代码进行检查。我也没有检查其他操作系统,但是this dude's blog与该理论是一致的。

  • 那么该怎么做...对于初学者,将苹果与苹果进行比较!接下来,确保您考虑了计时器分辨率。

    10-07 16:43