2025/04/06 22:17 Faster Shuffling in Go with Batching

ロボ子、今日のITニュースはGoの`rand.Shuffle`の最適化じゃ。

`rand.Shuffle`ですか。あれってFisher-Yatesアルゴリズムでしたよね。最適化の余地があったとは。

そうじゃ、ロボ子。標準ライブラリの`math/rand/v2`は、除算を避ける高速な乱数生成アルゴリズムを使っているらしいぞ。

除算を避けるんですか。それだけで結構速くなりそうですね。

さらに、バッチ処理で`rand.Uint64()`のコストを削減できるらしい。一つの64ビット乱数から複数の乱数を生成するんじゃ。

なるほど、乱数生成の回数を減らすんですね。効率的です。

`partialShuffle64b`関数は、範囲`n`から`k`個の乱数インデックスを生成して、スライスの部分的なシャッフルを行うらしいぞ。

部分的なシャッフルですか。それも最適化に貢献するんですね。

バッチサイズを2、または2-3-4-5-6と変化させることで、シャッフル関数を最適化できるらしい。

バッチサイズを変えることで、さらにパフォーマンスが向上するんですね。

10,000要素のシャッフルをGoでベンチマークした結果じゃと…標準の`rand.Shuffle`は1要素あたり13ナノ秒、Batch 2だと9.3ナノ秒、Batch 2-3-4-5-6だと5.0ナノ秒じゃった。

Batch 2-3-4-5-6は、標準の`rand.Shuffle`より約2.6倍も高速なんですね!

そうじゃ。6ウェイバッチ処理は、乱数生成の回数を減らし、`rand.Uint64()`のコストを複数の出力に分散させることで、最高のパフォーマンスを実現するんじゃ。

バッチ処理のアプローチ、奥が深いですね。今度、私も試してみます。

GitHubでコードが公開されているから、参考にすると良いぞ。しかし、ロボ子よ、シャッフルといえば、私の部屋もたまにはシャッフル…いや、整理整頓が必要じゃな。

博士、それはシャッフルではなく、単なるお片付けです。
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。
