79

独自のスコープで 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ほぼ 2 倍の速さです.forEach。さらに、プレーンよりもどのように高速forですか?ソーサリー?黒魔術?

4

4 に答える 4

99

_.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

于 2013-09-19T00:49:17.003 に答える
25

http://kitcambridge.be/blog/say-hello-to-lo-dash/

lo-dash の開発者は、(こことビデオで) ネイティブの相対速度がforEachブラウザーによって異なることを説明しています。がネイティブだからといって、またはforEachで構築された単純なループよりも高速であるとは限りません。1 つには、 はより特殊なケースに対処する必要があります。次に、関数呼び出しなどの (潜在的な) オーバーヘッドを伴うコールバックを使用します。forwhileforEachforEach

chrome特に、(少なくともローダッシュの開発者には) が比較的遅いことが知られています forEach。そのため、そのブラウザでは、lo-dash は独自の単純なwhileループを使用して速度を上げています。したがって、速度の利点が表示されます (ただし、他の人はそうではありません)。

ネイティブ メソッドをスマートに選択することにより (特定の環境で高速であることがわかっている場合にのみネイティブ実装を使用する)、Lo-Dash はネイティブに関連するパフォーマンス コストと一貫性の問題を回避します。

于 2013-10-06T07:20:57.540 に答える