私たちは匿名関数を通じてコールバックを作成することがよくあります。
簡単に言うと、匿名とは名前のない関数を意味し、通常はすぐに実行されます。しかし、名前付き関数 (名前付き関数) と比較してパフォーマンスはどうなのでしょうか?
シェル コマンドを実行し、多数の関数呼び出しを使用できるコンピューターを見つけて、2 つの実行時間を確認できます。
anonymous.js
変数数 = 100000000
、合計 = 0
while (count--) (function() { sum })()
実行してください
$ time ノード anonymous.js
実質0分1.456秒
ユーザー 0分0.015秒
システム 0分0.031秒
名前付き関数を見てみましょう
named.js
変数数 = 100000000
、合計 = 0
var cb = function() {
合計
}
while (count--) cb()
実行してください
$ time ノードnamed.js
実質0分0.575秒
ユーザー 0m0.000s
システム 0 分 0.046 秒
名前付き関数ははるかに高速ですが、これはなぜでしょうか?実際、説明するのは難しくありません。匿名関数はコールバックを毎回再解釈する必要がありますが、名前付き関数は 1 回だけ解釈すればよいため、パフォーマンスは向上します。ただし、この改善は非常にわずかであることがテストでわかりました。別の変数として記述された非常に便利なコールバックを分離する必要はありません。
さらに、名前付き関数を記述するには 2 つの方法があります。
関数式
var func = function() {
console.log('a')
}
関数宣言
関数 func() {
console.log('b')
}
実際、
のように、これら 2 つを一緒に使用すると問題が発生する可能性があります。
var func = function() {
console.log('a')
}
関数 func() {
console.log('b')
}
// 出力は次のとおりです: a
そのため、現在は関数表現の形式が主流ですが、関数宣言の性能はどうなのでしょうか?
named2.js
変数数 = 100000000
、合計 = 0
関数 cb() {
合計
}
while (count--) cb()
実行して 2 つを比較してください
$ time ノードnamed.js
実質0分0.553秒
ユーザー 0m0.000s
システム 0 分 0.015 秒
$ time ノードnamed2.js
実質0分0.529秒
ユーザー 0m0.000s
システム 0 分 0.047 秒
関数宣言の方が若干速くなるようですが、速度は非常に目に見えません。個人的には、やはり関数宣言を書くことをお勧めします。
追記: このデータは、Windows 7 で git-base を使用してテストされました。