2013-01-31 51 views
8

我编写了一些C代码,我使用MEX编译后称之为MATLAB。内的C代码,我使用下面的代码测量的计算的部分的时间:MATLAB的tic-toc&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。0.0016)。

在这里,人们可以发现两个很奇怪的事实:

  1. 的执行时间整体功能比执行时间码的一部分低。因此,无论是MATLAB还是C的测量都非常不准确。
  2. 在C代码中测量的执行时间非常分散,并且表现出非常高的st。偏差(变异系数为44%,而tic-toc仅为13%)。

这些计时器是怎么回事?

+0

什么是时钟的分辨率是多少?我们如何知道'begin = clock();'是在时钟周期之前还是之后执行?这会影响结果吗?大概。 –

+0

@BoPersson所以,你的意思是'时钟()'可以在最想念蜱? –

+4

我的意思是说一个勾号可能会大到影响结果。像18毫秒。 –

回答

6

你在比较苹果和橘子。

看看Matlab的文档:

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

抽动TOC让你衡量实际经过的时间。

现在看看时钟功能http://linux.die.net/man/3/clock

特别地,

时钟()函数返回一个近似的程序所使用的处理器时间

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

那么可以考虑您的区别:

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

那么对于初学者做...,逐个比较!接下来,请确保您考虑到计时器分辨率。