首頁 >web前端 >js教程 >JavaScript中匿名、命名函數的效能測試_基礎知識

JavaScript中匿名、命名函數的效能測試_基礎知識

WBOY
WBOY原創
2016-05-16 16:37:171242瀏覽

我們經常透過匿名函數(Anonymous function)來寫回呼。

簡單來講匿名即沒有名字的函數,一般都立即執行。但是它與命名函數(有名字的函數)的表現如何呢?

我們可以比較一下,我們隨便找一台可以執行Shell命令的計算機來使用大量函數呼叫看一看二者執行消耗時間:

anonymous.js

複製程式碼 程式碼如下:

var count = 100000000
  , sum   = 0
while (count--) (function() { sum })()

執行一下
複製程式碼 程式碼如下:

$ time node anonymous.js
real    0m1.456s
user    0m0.015s
sys     0m0.031s

再來看看命名函數

named.js

複製程式碼 程式碼如下:

var count = 100000000
  , sum   = 0

var cb = function() {
  sum
}

while (count--) cb()


執行一下
複製程式碼 程式碼如下:

$ time node named.js
real    0m0.575s
user    0m0.000s
sys     0m0.046s

命名函數會快很多,為什麼會這樣呢?其實不難解釋,匿名函數每次都需要重新解釋回調,但是命名函數只需要解釋一次,因此性能會有提升,但是測試發現這種提升是非常非常微小的,完全不必將非常順手的一個回調單獨寫成另外一個變數。

另外命名函數還有兩種寫法:

函數表達式

複製程式碼 程式碼如下:

var func = function() {
  console.log('a')
}

函數宣告
複製程式碼 程式碼如下:

function func() {
  console.log('b')
}

其實這兩個一起用的話可能會有問題,如
複製程式碼 程式碼如下:

var func = function() {
  console.log('a')
}
function func() {
  console.log('b')
}
//輸出為: a

因此目前多使用函數表達式的形式,但函數宣告的效能如何呢?

named2.js

複製程式碼 程式碼如下:

var count = 100000000
  , sum   = 0

function cb() {
  sum
}

while (count--) cb()


執行一下,比較二者
複製程式碼 程式碼如下:

$ time node named.js
real    0m0.553s
user    0m0.000s
sys     0m0.015s

$ time node named2.js
real    0m0.529s
user    0m0.000s
sys     0m0.047s


似乎函數宣告會稍微快一點點,不過快得也非常非常不明顯,個人還是建議函數聲明式寫法。

PS: 此資料皆在Windows7下使用git-base測試。

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn