2013-04-04 41 views
2

當我嘗試加速遞歸函數時,我發現了一些奇怪的東西。當我將用於記憶的對象傳遞給函數而不是全局變量時,代碼執行變得相當慢。爲什麼遞歸使用全局變量而不是本地變量時更快?

因此,不是這樣的:

var memoizationObj = {}; 
function factorial(n) { 
    // factorial code 
}; 

var a = factorial(10); 

我改變了代碼如下:

function factorial(n, memoizationObj) { 
    // factorial code 
}; 
var b = factorial(10, {}); 

和代碼執行成爲> 50倍的速度較慢。

jsperf

這究竟是爲什麼?以下是帶有完整代碼的jsperf

+0

請看看這篇文章,它是我最喜歡的一個編寫高效的JavaScript代碼:http://oreilly.com/server-administration/excerpts/even-faster-websites/writing- effective-javascript.html – 2013-04-04 19:13:42

回答

2

原因是setUp只針對所有試驗調用一次,所以在全球版本的第一個試用版之後的每個試用版中,您都以完整備忘錄開始。基本上,你只計算一次值,所有後續運行只返回一個緩存結果。

爲了更好地比較,請參閱此版本,它重置每次全球測試的全局備忘錄。

http://jsperf.com/recursion-with-global-obj-vs-arg/2

+1

+1進行正確的解釋。 – 2013-04-04 19:33:51

相關問題