我注意到,第一次运行脚本时,比第二次和第三次花费的时间要多得多。没有解释,提到in this question的“热身”。我想知道,为什么代码在“预热”之后运行得更快?在调用之间我不需要clear all
,但输入参数会随着每个函数调用而改变。有人知道为什么吗?为什么脚本“预热”后Matlab运行速度更快?
回答
第一次运行得更快的一个原因是很多事情都被初始化了一次,并且他们的结果被下一次缓存和重用。例如,在M侧,变量可以定义为persistent,其功能可以是locked。这也可能发生在事物的MEX-side。
此外,许多依赖关系在第一次之后加载并保留在内存中以便重新使用。这包括M函数,OOP类,Java类,MEX函数等等。这适用于内置和用户定义的内置。
例如发出以下command之前和运行脚本第一次运行之后,再比较:
[M,X,C] = inmem('-completenames')
注意clear all
不一定clear上述所有的,更何况锁定功能..
最后让我们不要忘记加速器的作用。在每次调用函数时都不需要解释M代码,而是在运行时将其编译为机器代码指令。 JIT编译仅在第一次调用时发生,因此理想情况下,在下列时间运行目标代码的效率将会克服每次运行时重新解释程序的开销。
谢谢Amro!如果只有必要的程序在P代码缓冲区中,而不是所有用于其他函数调用的东西,我不知道它们是否会运行得更快?即在对特定脚本进行基准测试之前,我应该“清除所有”吗?我没有注意到一个显着的不同,但我没有“填满”缓冲区... –
Amro,除非你的代码很小,否则JIT编译是加速代码运行的主要效果,加载功能并不重要。而且,JIT编译不仅发生在第一次调用时--MATLAB有时只会在第一次运行时JIT编译部分代码,稍后会进行其他部分的编译。 @RobertP,如果你需要对代码进行基准测试,在你引用的问题中链接到的'timeit'函数是最好的方法。除其他外,它处理您为您描述的所有“热身”问题。 –
@SamRoberts:我同意,这当然是JIT编译的承诺。如果重复调用一段代码,我们希望JIT编译器能够在运行时检测到这个“热点”,并将其优化为直接的机器代码。希望即使不是全部都在同一运行中。至于函数加载,我认为对于加载外部依赖关系的开销较高的MEX函数来说更是一个问题。 – Amro
Amro和Marc没有提及的另一个问题是内存(预)分配。
如果你的脚本没有预分配它的内存,它的第一次运行将会非常缓慢,因为内存分配。一旦它完成了第一次迭代,所有的内存都被分配了,所以脚本的连续调用会更有效率。
一个说明性的例子
for ii = 1:1000
vec(ii) = ii; %// vec grows inside loop the first time this code is executed only
end
@Shai对于预分配是正确的,但是我想对后果持不同意见。这样做的代码*写得很糟糕*。预热这种代码会使下一次更快,但在这种情况下*算法很糟糕*。这就是为什么我觉得,在这种情况下,热身实际上扭曲了代码不佳的优势,并掩盖了糟糕的实现! –
@Shai预分配是一件好事,但它对第一次和后续调用具有相同的效果。在你的例子中,'vec'不会只在代码第一次执行时增长,每次代码执行时它都会增长。 –
@Shai,对不起,这不是真的,因为它在脚本中,所以如果你再次运行脚本,'vec'就已经存在。如果它是一个函数,每次代码执行时都会增长,而不仅仅是第一次。 –
除了像JIT编译特定Matlab的原因,现代CPU具有大容量高速缓存,分支预测等。使用汇编语言进行基准测试也是一个问题。另外,更重要的是,现代CPU通常在低时钟速度下空闲,并且在几毫秒的持续负载后才跳到全速。
英特尔的Turbo功能变得更加时髦:当功耗和散热限制允许时,CPU可以运行得比其可持续最大频率更快。因此,如果您不小心控制这些因素,那么您的基准测试的第一次〜20秒到1分钟的运行速度可能会比其余的时间快。
- 1. 为什么Directory.GetFiles()在后续运行中运行速度更快?
- 2. 为什么在预热阶段浮点运算更快?
- 3. 为什么KNN中的KNN实现运行速度更快?
- 4. 为什么仪表C程序运行速度更快?
- 5. 为什么脚本作为模块运行得更快?
- 6. 为什么我的Python脚本与Matlab相比速度太慢?
- 7. 快速简单:为什么不运行?
- 8. 为什么PHP脚本放慢速度?
- 9. 为什么第一次运行HttpClient速度很慢但速度要快得多?
- 10. 为什么两个连接运行速度比OR条件快?
- 11. 为什么PHP的运行速度快于MySQL
- 12. 使用自动热键使脚本运行更快
- 13. 为什么quickSort运行速度较慢?
- 14. 检查2列脚本快速运行
- 15. 为什么执行速度更快:使用offsetWidth和offsetHeight隐藏?
- 16. 哪些功能运行速度更快?
- 17. 选择:哪个运行速度更快?
- 18. Jar文件 - 运行速度更快?
- 19. Perl机械化 - 如何使脚本运行速度更快,开销更少
- 20. 为什么我的代码运行速度更快,如果我编译codeBlocks
- 21. 为什么我的代码在运行Performance Analysis时速度更快?
- 22. 当我重定向stdout时,为什么我的程序运行速度更快?
- 23. jQuery脚本运行速度很慢
- 24. Google Apps脚本运行速度很慢
- 25. 快速bash脚本在指定文件夹中运行脚本?
- 26. 了解什么影响脚本速度
- 27. 具有较高的成本计划的运行速度更快
- 28. 我应该运行NSTimer的最快速度是什么?
- 29. 在latin1中查询速度很快,utf8速度慢 - 为什么?
- 30. 为什么IEnumerable速度慢,List速度很快?
一个重要的问题是:你想比较几个matlab过程*或*你想比较matlab实现与其他人(fortran,c,八度,...)吗?在第二种情况下,公平比较很难实现。 –
@MarcClaesen:我只比较Matlab进程=) –
也许你也使用在线许可证服务器,就像我们在这里做的那样。在这种情况下,只需检查许可证需要相当长的一段时间。顺便说一句。在运行之间“清除所有”时会发生什么? – Trilarion