我注意到第一次运行脚本时,它比第二次和第三次1花费的时间要多得多。这个问题中提到了“热身” ,没有任何解释。
为什么代码“热身”后运行速度更快?
我不在clear all
调用2之间,但是每个函数调用的输入参数都会改变。有人知道为什么吗?
1. 我的驾照在本地,所以不是驾照检查的问题。
2. 实际上,如果 I ,行为不会改变clear all
。
我注意到第一次运行脚本时,它比第二次和第三次1花费的时间要多得多。这个问题中提到了“热身” ,没有任何解释。
为什么代码“热身”后运行速度更快?
我不在clear all
调用2之间,但是每个函数调用的输入参数都会改变。有人知道为什么吗?
1. 我的驾照在本地,所以不是驾照检查的问题。
2. 实际上,如果 I ,行为不会改变clear all
。
第一次之后它运行得更快的一个原因是很多东西都被初始化一次,它们的结果被缓存并在下一次被重用。例如在 M 端,可以将变量定义为可锁定的函数中的持久变量。这也可能发生在MEX方面。
此外,许多依赖项在第一次之后被加载并保留在内存中以供重复使用。这包括 M 函数、OOP 类、Java 类、MEX 函数等。这适用于内置和用户定义的。
例如,在首次运行脚本之前和之后发出以下命令,然后进行比较:
[M,X,C] = inmem('-completenames')
请注意,clear all
不一定清除上述所有内容,更不用说锁定的功能......
最后让我们不要忘记加速器的作用。不是每次调用函数时都解释 M 代码,而是在运行时将其编译为机器代码指令。JIT 编译仅在第一次调用时发生,因此理想情况下,后续运行目标代码的效率将克服每次运行时重新解释程序的开销。
Matlab 被解释。如果您不预热代码,您将因为解释而不是实际算法而浪费大量时间。这会显着扭曲时序结果。
至少运行一次代码将使 Matlab 能够实际编译适当的代码段。
除了诸如 JIT 编译等特定于 Matlab 的原因之外,现代 CPU 还具有大型缓存、分支预测器等。即使在汇编语言中,预热这些也是基准测试的一个问题。
此外,更重要的是,现代 CPU 通常在低时钟速度下闲置,并且只有在持续负载几毫秒后才会跳到全速。
英特尔的Turbo功能变得更加时髦:当功率和热限制允许时,CPU 的运行速度可以超过其可持续的最大频率。因此,如果您不小心控制这些因素,您的基准测试的前约 20 秒到 1 分钟可能会比其余部分运行得更快。