私はthis Codewars challengeを試していましたが、問題は数値の除数を見つけて、これらの除数の平方和を計算することです。この問題には2つのアプローチがありました。JavaScriptパフォーマンス:reduce()とforループの比較
最初のアプローチは、finding the sum of all divisorsについては、別のStackOverflowの質問に基づいており、最初に巧妙なようです:
function divisorsSquared(n) {
// create a numeric sequence and then reduce it
return [...Array(n+1).keys()].slice(1)
.reduce((sum, num)=>sum+(!(n % (num)) && Math.pow(num,2)), 0);
}
私は、単純なforループを使用していた使用される第二のアプローチ:今
function divisorsSquared(n) {
var sum = 0;
for(var i = 1; i<= n; i++){
if(n % i === 0) sum += Math.pow(i,2);
}
return sum;
}
をI最初のアプローチが2番目のアプローチよりも大幅に遅く、迅速なjsperf testがこれを確認することに気づいた。
私の質問は次のとおりです。なぜ最初のアプローチが非常に遅く、プロダクションコードではどのようなアプローチが望ましいのですか?
コードワーズでは、多くの課題に対して、同様の配列メソッドを使用する賢明な1行のソリューションがあることに気付きました。初心者としては、たとえパフォーマンスが悪化したとしても、そのようなソリューションをfor-loopsよりも優れた方法と考えることができますか?
あなたはコードを見れば、削減する反復処理し、その後、最初のものは、コンストラクタを使用して、その後、繰り返し処理が普及し、その後、繰り返し処理は、キーを取得するには、その後、繰り返し処理はスライスします... 2回目は一度繰り返す。 – adeneo
私はそれについては考えていませんでしたが、今はかなり明らかです。ありがとう! –