2013-06-01 42 views
18

我注意到,第一次运行脚本时,比第二次和第三次花费的时间要多得多。没有解释,提到in this question的“热身”。我想知道,为什么代码在“预热”之后运行得更快?在调用之间我不需要clear all,但输入参数会随着每个函数调用而改变。有人知道为什么吗?为什么脚本“预热”后Matlab运行速度更快?

+0

一个重要的问题是:你想比较几个matlab过程*或*你想比较matlab实现与其他人(fortran,c,八度,...)吗?在第二种情况下,公平比较很难实现。 –

+0

@MarcClaesen:我只比较Matlab进程=) –

+0

也许你也使用在线许可证服务器,就像我们在这里做的那样。在这种情况下,只需检查许可证需要相当长的一段时间。顺便说一句。在运行之间“清除所有”时会发生什么? – Trilarion

回答

8

第一次运行得更快的一个原因是很多事情都被初始化了一次,并且他们的结果被下一次缓存和重用。例如,在M侧,变量可以定义为persistent,其功能可以是locked。这也可能发生在事物的MEX-side

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

例如发出以下command之前和运行脚本第一次运行之后,再比较:

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

注意clear all不一定clear上述所有的,更何况锁定功能..

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

+0

谢谢Amro!如果只有必要的程序在P代码缓冲区中,而不是所有用于其他函数调用的东西,我不知道它们是否会运行得更快?即在对特定脚本进行基准测试之前,我应该“清除所有”吗?我没有注意到一个显着的不同,但我没有“填满”缓冲区... –

+1

Amro,除非你的代码很小,否则JIT编译是加速代码运行的主要效果,加载功能并不重要。而且,JIT编译不仅发生在第一次调用时--MATLAB有时只会在第一次运行时JIT编译部分代码,稍后会进行其他部分的编译。 @RobertP,如果你需要对代码进行基准测试,在你引用的问题中链接到的'timeit'函数是最好的方法。除其他外,它处理您为您描述的所有“热身”问题。 –

+0

@SamRoberts:我同意,这当然是JIT编译的承诺。如果重复调用一段代码,我们希望JIT编译器能够在运行时检测到这个“热点”,并将其优化为直接的机器代码。希望即使不是全部都在同一运行中。至于函数加载,我认为对于加载外部依赖关系的开销较高的MEX函数来说更是一个问题。 – Amro

2

被解释。如果你没有预热代码,由于解释而不是实际的算法,你将会失去很多时间。这可能会严重影响计时结果。

运行代码几次将使实际编译适当的代码段。

0

AmroMarc没有提及的另一个问题是内存(预)分配。
如果你的脚本没有预分配它的内存,它的第一次运行将会非常缓慢,因为内存分配。一旦它完成了第一次迭代,所有的内存都被分配了,所以脚本的连续调用会更有效率。

一个说明性的例子

for ii = 1:1000 
    vec(ii) = ii; %// vec grows inside loop the first time this code is executed only 
end 
+3

@Shai对于预分配是正确的,但是我想对后果持不同意见。这样做的代码*写得很糟糕*。预热这种代码会使下一次更快,但在这种情况下*算法很糟糕*。这就是为什么我觉得,在这种情况下,热身实际上扭曲了代码不佳的优势,并掩盖了糟糕的实现! –

+0

@Shai预分配是一件好事,但它对第一次和后续调用具有相同的效果。在你的例子中,'vec'不会只在代码第一次执行时增长,每次代码执行时它都会增长。 –

+0

@Shai,对不起,这不是真的,因为它在脚本中,所以如果你再次运行脚本,'vec'就已经存在。如果它是一个函数,每次代码执行时都会增长,而不仅仅是第一次。 –

1

除了像JIT编译特定Matlab的原因,现代CPU具有大容量高速缓存,分支预测等。使用汇编语言进行基准测试也是一个问题。另外,更重要的是,现代CPU通常在低时钟速度下空闲,并且在几毫秒的持续负载后才跳到全速。

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

相关问题