我写了一些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编译后),并使用“tic”和“toc”来测量其执行时间。令人完全不可思议的是,使用“tic”和“toc”计算的时间为0.0011秒(500次运行的平均值,标准偏差为1.4e-4),而由C代码返回的时间为0.037秒(500次运行的平均值,标准偏差为0.0016)。
这里可以注意到两个非常奇怪的事实:
1.整个函数的执行时间低于代码一部分的执行时间。因此,要么MATLAB的测量不准确,要么C测量不准确。
2.C代码中测得的执行时间非常散乱,并且表现出非常高的标准偏差(变异系数为44%,而tic-toc仅为13%)。
这些计时器到底怎么了?
begin = clock();
是在一个时钟周期之前还是之后执行的?这会影响结果吗?很可能会。 - Bo Perssonclock()
最多可能会错过一次计时吗? - Pantelis Sopasakis/* do stuff */
放入一个循环中。另外,参考这篇文章:https://dev59.com/8HRB5IYBdhLWcg3wj32c 有关于clock()
分辨率的内容。 - s.bandara