19

我注意到第一次运行脚本时,它比第二次和第三次1花费的时间要多得多。这个问题中提到了“热身” ,没有任何解释。

为什么代码“热身”后运行速度更快?

我不在clear all调用2之间,但是每个函数调用的输入参数都会改变。有人知道为什么吗?


1. 我的驾照在本地,所以不是驾照检查的问题。

2. 实际上,如果 I ,行为不会改变clear all

4

4 回答 4

9

第一次之后它运行得更快的一个原因是很多东西都被初始化一次,它们的结果被缓存并在下一次被重用。例如在 M 端,可以将变量定义为可锁定的函数中的持久变量。这也可能发生MEX方面。

此外,许多依赖项在第一次之后被加载并保留在内存中以供重复使用。这包括 M 函数、OOP 类、Java 类、MEX 函数等。这适用于内置和用户定义的。

例如,在首次运行脚本之前和之后发出以下命令,然后进行比较:

[M,X,C] = inmem('-completenames')

请注意,clear all不一定清除上述所有内容,更不用说锁定的功能......

最后让我们不要忘记加速器的作用。不是每次调用函数时都解释 M 代码,而是在运行时将其编译为机器代码指令。JIT 编译仅在第一次调用时发生,因此理想情况下,后续运行目标代码的效率将克服每次运行时重新解释程序的开销。

于 2013-06-01T21:32:35.113 回答
2

Matlab 被解释。如果您不预热代码,您将因为解释而不是实际算法而浪费大量时间。这会显着扭曲时序结果。

至少运行一次代码将使 Matlab 能够实际编译适当的代码段。

于 2013-06-01T15:09:51.047 回答
1

除了诸如 JIT 编译等特定于 Matlab 的原因之外,现代 CPU 还具有大型缓存、分支预测器等。即使在汇编语言中,预热这些也是基准测试的一个问题。

此外,更重要的是,现代 CPU 通常在低时钟速度下闲置,并且只有在持续负载几毫秒后才会跳到全速。

英特尔的Turbo功能变得更加时髦:当功率和热限制允许时,CPU 的运行速度可以超过其可持续的最大频率。因此,如果您不小心控制这些因素,您的基准测试的前约 20 秒到 1 分钟可能会比其余部分运行得更快。

于 2016-06-29T14:37:24.457 回答
0

AmroMarc没有提到的另一个问题是内存(预)分配。
如果您的脚本没有预先分配它的内存,那么由于内存分配,它的第一次运行会非常慢。一旦它完成了它的第一次迭代,所有的内存都被分配了,所以脚本的连续调用会更有效率。

一个说明性的例子

for ii = 1:1000
    vec(ii) = ii; %// vec grows inside loop the first time this code is executed only
end
于 2013-06-02T09:01:12.023 回答