2014-09-27 69 views
3

我在比較eval(code)new Function(code)之間的執行時間。爲什麼新的函數(代碼)比直接執行相同的代碼更快?

我發現new Function(code)比直接執行相同的代碼更快。

是什麼原因?

var start = new Date().getTime(); 
 

 
var test = ''; for (var i = 0; i < 1000000; ++i) { test += 'a'; } 
 

 
var end = new Date().getTime(); 
 

 
console.log('Execution time: ' + (end - start)); 
 

 
// vs. 
 

 
var start2 = new Date().getTime(); 
 

 
var f = new Function("var test = ''; for (var i = 0; i < 1000000; ++i) { test += 'a'; }"); 
 

 
f(); 
 

 
var end2 = new Date().getTime(); 
 

 
console.log('Execution time: ' + (end2 - start2));

+0

@Sirko:我的不好。 :)但編輯後,第二個版本仍然似乎更快 – 2014-09-27 18:46:47

+0

我相信這是因爲JavaScript是單線程 – Brendan 2014-09-27 19:08:05

回答

4

這實際上已經沒有任何關係,你要創建一個功能,而是與test變量的作用域的事實。

由於JavaScript是一種動態語言,因此每次在代碼中使用一個名爲test的符號時,JavaScript訪問全局變量要比訪問本地語言慢得多,因爲它是scope chain--簡單地說,JS引擎需要「查找它「並且看看那個符號實際代表了什麼(它被定義在哪裏)。在這個查找中,全局變量是它看起來最後的地方。因此,訪問局部變量比訪問全局變量要快得多。

在代碼的第一部分,變量test是一個全局變量,因此循環的每次迭代都需要從解釋器進行全面查找才能找到它。但是,在您定義的功能中,test在本地重新定義,使訪問速度更快。

這是一個jsperf slug顯示這一點。

+0

[這是一個更新的測試用例](http://jsperf.com/local-vs-global222/4),它doesn再沒有表現出巨大的差異。 – Bergi 2014-09-27 19:27:39

相關問題