8

在使用 MEX 编译后,我编写了一些 C 代码,我称之为 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);

Elapsed time 应该是以秒为单位的执行时间。

然后我将值输出time_elapsed到 MATLAB(它已正确导出;我检查了)。然后在 MATLAB 端我调用这个 C 函数(在我使用 MEX 编译它之后)并使用ticand测量它的执行时间toc。事实证明完全荒谬的是,我使用 tic 和 toc 计算的时间是 0.0011 秒(500 次运行的平均值,st.dev. 1.4e-4),而 C 代码返回的时间是 0.037 秒( 500 次运行的平均值,标准偏差 0.0016)。

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

  1. 整个函数的执行时间低于部分代码的执行时间。因此,MATLAB 或 C 的测量非常不准确。
  2. 在 C 代码中测量的执行时间非常分散,并且表现出非常高的 st。偏差(变异系数为 44%,而 tic-toc 仅为 13%)。

这些计时器是怎么回事?

4

1 回答 1

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() 函数返回程序使用的处理器时间的近似值

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

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

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

那么该怎么办...首先,将苹果与苹果进行比较!接下来,确保您考虑计时器分辨率。

于 2013-02-01T03:44:14.340 回答