1. ホーム
  2. javascript

なぜlodash.eachはネイティブのforEachより速いのか?

2023-08-22 19:15:07

質問

私は、独自のスコープを持つforループを実行する最速の方法を見つけようとしていました。私が比較したのは3つの方法です。

var a = "t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t".split();

// lodash .each -> 1,294,971 ops/sec
lodash.each(a, function(item) { cb(item); });

// native .forEach -> 398,167 ops/sec
a.forEach(function(item) { cb(item); });

// native for -> 1,140,382 ops/sec
var lambda = function(item) { cb(item); };
for (var ix = 0, len = a.length; ix < len; ix++) {
  lambda(a[ix]);
}

これはOS X上のChrome 29でのテストです。ここで自分でテストを実行することができます。

http://jsben.ch/BQhED

どのようにlodashの .each はネイティブの .forEach ? さらに言えば、プレーンな for ? ソーサリー?黒魔術か?

どのように解決する?

_.each() とは完全に互換性がありません。 [].forEach() . 次の例を見てください。

var a = ['a0'];
a[3] = 'a3';
_.each(a, console.log); // runs 4 times
a.forEach(console.log); // runs twice -- that's just how [].forEach() is specified

http://jsfiddle.net/BhrT3/

つまり、lodashの実装には if (... in ...) のチェックが欠けており、それがパフォーマンスの違いを説明している可能性があります。


上のコメントで指摘されているように、ネイティブの for との違いは、主にテストでの追加の関数ルックアップが原因です。より正確な結果を得るために、このバージョンを使用してください。

for (var ix = 0, len = a.length; ix < len; ix++) {
  cb(a[ix]);
}

http://jsperf.com/lo-dash-each-vs-native-foreach/15