MATLAB tic-toc& C的时钟差异

时间:2013-01-31 22:55:31

标签: c matlab time mex

我编写了一些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次运行,st.dev.00,616)。

这里可能会注意到两个非常奇怪的事实:

  1. 整个功能的执行时间低于部分代码的执行时间。因此,MATLAB或C的测量值都非常不准确。
  2. 在C代码中测量的执行时间非常分散并且表现出非常高的st。偏差(变异系数44%,而tic-toc仅为13%)。
  3. 这些计时器发生了什么事?

1 个答案:

答案 0 :(得分:6)

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

查看Matlab的文档:

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

tic toc 让您测量实际经过的时间。

现在查看 clock 函数http://linux.die.net/man/3/clock

特别是

  

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

     

返回的值是到目前为止使用的 CPU时间作为clock_t;至   获取使用的秒数,除以CLOCKS_PER_SEC。如果   使用的处理器时间不可用或其值不能   表示,该函数返回值(clock_t)-1。

那么什么可以解释你的差异:

  • CPU时间(由时钟()测量)和实际经过时间(由tic和toc测量)不相同。所以你会期望cpu时间少于经过的时间?也许。如果在0.0011秒内你以10%的速度驱动10个内核怎么办?这意味着clock()测量值是用tic和toc测量的10倍。可能,不太可能。
  • 时钟(。)非常不准确,并且与文档一致,它是近似 cpu时间测量!我怀疑它与调度程序量程大小挂钩,但我没有深入研究Linux内核代码来检查。我也没有检查其他操作系统,但this dude's blog与该理论一致。

那么该做什么...对于初学者来说,比较苹果和苹果!接下来,请务必考虑计时器分辨率。