👉

reduceRightとtoReversed&reduceを比較

2024/08/03に公開

https://zenn.dev/cybozu_frontend/articles/js_basic_array
こちらの記事で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