2017-05-17 18 views
12

我問這個問題,因爲我和我的同事對編碼風格發生爭執,因爲他更喜歡箭函數聲明:箭頭比v8中的普通獨立函數聲明更快速(更高性能,更輕)嗎?

const sum = (a, b) => a + b; 

,我更喜歡老式的獨立函數聲明:

function sum(a, b) { 
    return a + b; 
} 

我要點是舊式的代碼更具可讀性,並且可以更清楚地區分函數和變量聲明。他的觀點是具有箭頭功能的代碼運行得更快。

當您使用舊式獨立函數聲明而不是箭頭函數時,您是否知道有關實際性能損失(v8中)的內容?罰款是否真的存在?

+1

[使用ES6箭頭函數有沒有性能提升?](http://stackoverflow.com/questions/42772817/are-there-performance-gains-in-using-es6-arrow-functions) –

+1

我預計性能差異將可以忽略不計,並取決於供應商。函數體以相同的方式運行*。不同之處在於函數對象實例化(例如'prototype'屬性)和執行上下文實例化(例如接收器)。 – Ben

+0

@Jonasw我的問題更具體。我只對v8細節感興趣,當其他問題沒有指定任何環境時。我將編輯問題更清楚。 –

回答

19

V8開發者他回覆。對於常規函數聲明,箭頭函數(大部分)只是「語法糖」。他們不是更快。

+0

箭頭函數表達式比合成糖更多。他們基本上仍然創建'Function'對象。我從來沒有讀過ES6.0規格。完全(只有ES3.0)所以我所說的可能不是確切的,但是:調用一個由函數表達式構造的Function函數會在其執行上下文中爲this指定一個不同的值(這通常被稱爲「這個值來自調用者的作用域鏈)。 – Hydro

+1

@Matheus這意味着當箭頭函數使用'this'時,它需要創建一個閉包。沒什麼特別。另外,我希望在大多數情況下,函數* object *的創建都可以被優化掉,所以沒有必要創建'.prototype'對象也沒有任何好處。 – Bergi

+0

@Matheus:是的,圍繞'this'存在語義上的差異,這就是我寫「(主要)」的原因。這個問題(和我的答案)的要點是沒有性能差異 - 就像你說的那樣,在引擎蓋下它們是相同的'Function'對象,這就是爲什麼我認爲把它們稱爲「語法糖」是公平的, 。 - @Bergi:不幸的是,能夠優化功能對象的創建是個例外,而不是規則,因爲JavaScript中有很多東西是可觀察的。由於這個原因,封閉程序往往會造成內存效率低下。 – jmrk

2

下面顯示的是:

  1. 沒有爲去第一點球(傳統或脂肪)
  2. 存在鉻

function goFat() { 
 
    for (var i = 0; i < 1000000; i++) { 
 
     var v =()=>{}; 
 
     v(); 
 
    } 
 
} 
 

 
function goTraditional() { 
 
    for (var i = 0; i < 1000000; i++) { 
 
     var v = function() {}; 
 
     v(); 
 
    } 
 

 
} 
 

 
function race() { 
 
    var start = performance.now(); 
 
    goTraditional(); 
 
    console.log('Traditional elapsed: ' + (performance.now() - start)); 
 
    start = performance.now(); 
 
    goFat() 
 
    console.log('Fat elapsed: ' + (performance.now() - start)); 
 
    start = performance.now(); 
 
    goTraditional(); 
 
    console.log('Traditional elapsed: ' + (performance.now() - start)); 
 
    start = performance.now(); 
 
    goFat() 
 
    console.log('Fat elapsed: ' + (performance.now() - start)); 
 
    console.log('------'); 
 
}
<button onclick="race()">RACE!</button>

沒有可辨別的差異
+4

由於您在點擊按鈕之前啓動了第一個計時器,因此存在巨大的損失... – Ryan

+0

哈哈!哦,是的......(更正) – Ben

+1

當你不知道在v8場景背後發生了什麼(我真的不知道我已經讀過v8的源代碼,但我不會專家),你可以'由於v8優化,我們可以正確解釋結果。查看這篇文章的一些例子http://mrale.ph/blog/2012/12/15/microbenchmarks-fairy-tale.html –

相關問題