我编写了一些 C 代码,在使用 MEX 编译后将其称为 MATLAB。在 C 代码中,我测量了 a 的时间part使用以下代码进行计算:
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
and toc
。事实证明完全荒谬的是,我使用 tic 和 toc 计算的时间是 0.0011s(500 次运行的平均值,st.dev.1.4e-4),而 C 代码返回的时间是 0.037s( 500 次运行的平均值,标准偏差 0.0016)。
这里人们可能会注意到两个非常奇怪的事实:
- 整个函数的执行时间低于部分代码的执行时间。因此,MATLAB 或 C 的测量结果非常不准确。
- C 代码中测量的执行时间非常分散,并且表现出非常高的稳定性。偏差(变异系数为 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 and toc让您测量实际经过的时间。
现在看看clock功能http://linux.die.net/man/3/clock.
尤其,
Clock() 函数返回一个处理器时间的近似值由程序使用。
返回的值是到目前为止使用的CPU时间作为时钟_t;到
获取使用的秒数,除以 CLOCKS_PER_SEC。如果
使用的处理器时间不可用或者其值无法
表示,该函数返回值 (clock_t) -1。
那么什么可以解释您的差异:
- CPU时间(由clock()测量)和实际运行时间(由tic和toc测量)不同。那么您会期望 cpu 时间小于经过时间吗?也许。如果您在 0.0011 秒内以 100% 的速度驱动 10 个内核会怎样?这意味着,clock() 测量值是 tic 和 toc 测量值的 10 倍。有可能,也不太可能。
- Clock(.) 非常不准确,并且与文档一致,它是一个近似cpu时间测量!我怀疑它与调度程序量子大小挂钩,但我没有深入研究 Linux 内核代码来检查。我也没有检查其他操作系统,但是这家伙的博客与该理论一致。
那么该怎么办...首先,比较苹果与苹果!接下来,请确保考虑计时器分辨率。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)