2012-03-09 10 views
16

reduce()メソッドのほとんどの使用例は、forループで簡単に書き直すことができます。また、JSPerfでテストすると、reduce()は通常、各繰り返しの内部で実行される操作に応じて60〜75%遅くなります。javascript Array reduce()メソッドを使用すると本当に有益ですか?

「機能的スタイル」でコードを書くことを除いて、reduce()を使用する本当の理由はありますか?ちょっとだけコードを書いて60%のパフォーマンスを上げることができたら、なぜreduce()を使うのですか?

EDIT:実際に、forEach()やmap()などの他の機能的メソッドもすべて同様のパフォーマンスを示し、単純なループよりも60%以上遅いです。

はここ(関数呼び出し付き)JSPerfテストへのリンクです:forloop vs forEach

答えて

5
  • あなたはスコープをお勧めします。たとえば、コールバック関数を作成したり、javascriptオブジェクトへの参照を持たせたい場合があります。詳細については、javascriptがスコープでブロックされない理由を参照してください。 [編集:現代のjavascriptはletの変数をサポートするようになりました。あなたがvar変数を宣言したESv6の前に戻ると、関数codeblockの先頭に書かれているかのように巻いたので、頻繁にfor-loopsの本体を関数として書く必要がありました。しかし、これはまだ当てはまります:]関数が書かれていれば、それが重要なボトルネックでない限り関数型を使うこともできます。
  • あなたのコードは必ずしもコンピュータのフルスピードで実行する必要はありません。ボトルネックでコードを最適化することさえできないかもしれません。
  • さらに、「JSPerfでのテスト」を提供していないので、それを批評することができます。例えば、あなたがすでにリダクション関数(またはmapまたはforEach関数)を持っているなら、パフォーマンスはon-parとなるでしょう。多くのブラウザが異なるように最適化したり、異なる関数呼び出しのオーバーヘッドを持つ場合には、テスト方法に欠陥があるかもしれません。

追記:これは構文の間で有効な性能比較ですが、中に無効な性能比較構文が手元に疑問はない場合:

myArray.map(function(x){return x+1}) 

// ...versus... 

for(var i=0; i<myArray.length; i++) { 
    myArray[i] = myArray[i]+1; 
} 

これは、有効な性能比較になります

myArray.forEach(function(x){return x+1}) 

// ...versus... 

var plusOne = function(x){return x+1}; 
for(var i=0; i<myArray.length; i++) { 
    plusOne(myArray[i]); 
} 

// (may need a side-effect if the compiler is smart enough to optimize this) 

(また、あなたの編集への返信で:.forEach().map()はるかに明快さを提供し、必要性を回避明示的なループint i=0; i<array.length; i++引数の場合)

+2

私は、有効なパフォーマンス比較を構成するものについてあなたに同意しません。 _first_は有効な比較です。なぜなら、「どのメソッドが最も速いのですが、関数呼び出しを使用しないメソッドは不適格です」という質問ではなく、「どのメソッドが配列の各要素に1つを追加するのが最も速いのですか?エントリから "。とにかくスコープ/クロージャの目的のために関数を望むと仮定した場合は、 '.reduce()'や '.forEach()'などを使用することもできます。 – nnnnnn

+0

質問は構文に関するものなので、有効なパフォーマンス比較です。おそらく、すべての可能なパフォーマンスを絞るシナリオで質問を言い換えるべきでしょう。その場合、私はプレーン・フォー・ループを使用しないような良い理由を見つけることができません。スコープが絶対に必要な具体的な例を教えてください。 –

+0

@EvanYou: '[1,2,3]。for(var i = 0; i <4; i ++){setTimeout(forAlert 1,2,3)}に対して、forEach(function(x){alert(x)}、 function(){alert(i)}、1000)} '(アラート4,4,4) – ninjagecko

関連する問題