我注意到第一次运行脚本时,它比第二次和第三次 1 需要更多的时间。提到“热身”in this question没有解释。
为什么代码在“预热”后运行得更快?
我在调用 2 之间没有clear all
,但每个函数调用的输入参数都会改变。有人知道为什么吗?
<子> 1.我在本地获得了许可证,因此这不是与许可证检查有关的问题。 子>
<子>
实际上,如果我clear all
,行为不会改变。
子>
答案 0 :(得分:9)
第一次运行后运行速度更快的一个原因是许多事情被初始化一次,并且它们的结果会被缓存并在下次重复使用。例如,在M侧,变量可以在persistent的函数中定义为locked。这也可能发生在MEX - side的事情上。
此外,许多依赖项在第一次之后加载,并在内存中保留以便重新使用。这包括M函数,OOP类,Java类,MEX函数等。这适用于内置和用户定义的。
例如,在第一次运行脚本之前和之后发出以下command,然后比较:
[M,X,C] = inmem('-completenames')
请注意clear all
并不一定clear以上所有内容,更不用说锁定的功能......
最后,让我们不要忘记加速器的作用。每次调用函数时,它都不是在解释M代码,而是在运行时编译成机器代码指令。 JIT编译仅在第一次调用时发生,因此理想情况下,以下时间运行目标代码的效率将克服每次运行时重新解释程序的开销。
答案 1 :(得分:2)
Matlab被解释。如果你没有预热代码,由于解释而不是实际的算法,你将失去很多时间。这可能会严重影响时间结果。
至少运行一次代码将使Matlab能够实际编译适当的代码段。
答案 2 :(得分:1)
除了特定于Matlab的原因(如JIT编译),现代CPU还有大型缓存,分支预测器等。即使在汇编语言中,对这些问题进行升温也是一个基准问题。
另外,更重要的是,现代CPU通常在低时钟速度下空闲,并且只能在几毫秒的持续负载后跳到全速。
英特尔的Turbo功能变得更加时髦:当功率和散热限制允许时,CPU的运行速度可以超过其可持续的最大频率。因此,如果您不小心控制这些因素,那么基准测试的前20秒到1分钟的运行速度可能比其余部分快。
答案 3 :(得分:0)