MATLAB的tic-toc和C的时钟差异

Pan*_*kis 8 c time matlab 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);
Run Code Online (Sandbox Code Playgroud)

经过的时间应该是以秒为单位的执行时间.

然后我将值输出time_elapsed到MATLAB(它被正确导出;我检查过).然后MATLAB端我调用这个C函数(在我使用MEX编译它之后)并使用tic和测量它的执行时间toc.结果是完全荒谬的是我使用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%).

这些计时器发生了什么事?

tha*_*ang 6

你将苹果与橙子进行比较.

看看Matlab的文档:

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

tictoc让你测量实际经过的时间.

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

特别是,

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

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

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

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

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