我注意到,第一次運行腳本時,比第二次和第三次花費的時間要多得多。沒有解釋,提到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