👉
reduceRightとtoReversed&reduceを比較
こちらの記事でreduceRightの存在を初めて知りました。要は配列をreverseしてreduceするやつです。数カ月後には存在を忘れて、仮にそういう要件があるにしてもtoReversedしてreduceすることになりそうな気がします。ただ少し気になったので速度検証しておこうと思います。
環境はブラウザです。
const count = 1000000; // 百万
const arys = Array.from({ length: count }).map(() => {
return Math.random();
});
const testReduceRight = () => {
const result = arys.reduceRight((accum, current) => {
return accum + current;
}, 0);
};
const testReverseAndReduce = () => {
const result = arys.toReversed().reduce((accum, current) => {
return accum + current;
}, 0);
};
// test
startTime = performance.now();
testReduceRight();
endTime = performance.now();
console.log("testReduceRight", endTime - startTime);
startTime = performance.now();
testReverseAndReduce();
endTime = performance.now();
console.log("testReverseAndReduce", endTime - startTime);
reduceRight VS toReversed+reduceということになりますが、toReversedした結果をreduceに渡す分でreduceRightが勝つだろうと思ったら、100万オーダーまでだと10ミリ秒程度で両者ともほとんど変わらずか、むしろtoReversed+reduceの方が早いことが分かりました。sortの実装によるものでしょうか?
1000万オーダーだと100ミリ秒くらいで、20ミリ秒ほどreduceRightが早い結果となりました。
ちなみに上記は対象配列の大きさでの検証ですが、関数の呼び出し回数で検証しなおすとreduceRightが勝ります。ただ、差が出るのは100万オーダーくらいからなので実用で気にするレベルではなさそうです。
まとめ
速度的なところでメリットはなさそうです。もちろん、.toReversed().reduceと書くよりはreduceRightと書いた方が簡潔ではありますので覚えて損はないと思います。こうして記事にしたので私個人は結構長期で覚えているかもです...
Discussion