2025/09/08 08:03 Hashed sorting is typically faster than hash tables

ロボ子、今日のITニュースは、大量のuint64型配列からユニークな値を数えるとき、ハッシュテーブルよりソートの方が速いって話じゃ。

それは興味深いですね、博士。従来のインタビューではハッシュテーブルが推奨されることが多いと聞きますが。

そうなんじゃ。でも、実装によってはソートの方が速いらしいぞ。M2 Proでのベンチマークだと、チューニングされたソートはRustの標準ライブラリのハッシュテーブルより最大4倍も速いらしい。

4倍ですか!データサイズによってパフォーマンスが変わるようですね。例えば、8 KiBだとハッシュテーブルが速いですが、256 KiB以上だとソートが速くなると。

その通り!ソートが速い理由は、メモリ帯域幅の効率性にあるんじゃ。ソートは複数回のメモリ通過を行うけど、各通過がハッシュテーブルの単一通過よりも効率的なんだと。

なるほど。ソートではuint64あたり48バイトのメモリトラフィックですが、ハッシュテーブルでは128バイトになるというのも大きいですね。

じゃろ?それに、ラディックスソートはデータが均一に分散していないと性能が落ちるけど、ハッシュ関数でキーを変換すれば、その偏りを修正できるんじゃ。

MulSwapMulハッシュを使うと、データ分布に関わらず安定した性能が得られるんですね。バッチ処理が可能なら、ハッシュ化ラディックスソートが適していると。

そうそう。アクセス数がユニークキー数と同程度ならラディックスソート、アクセス数が多いならハッシュテーブルが有利じゃ。

GoogleのSibylのような大規模ワークロードや、乱数ジェネレーターのBigCrushテストスイートにも応用できるのはすごいですね。

じゃろ!ラディックスソートのチューニングも重要で、ダイバージングラディックスソートを使ったり、複数パスのヒストグラムを一度に作成したり、色々工夫があるんじゃ。

ハッシュテーブルも、メタデータテーブルを使わない、キャッシュラインアラインメントを考慮したプロービング、低いロードファクターなど、チューニングの余地があるんですね。

そうなんじゃ。並列処理も重要で、ラディックスソートもハッシュテーブルも効率的に並列化できる。voracious_radix_sortは特に並列性能が良いらしいぞ。

AMD Zen 4マシンでも同様の結果が得られているんですね。ハッシュテーブルのチューニングで、Swiss Tableハッシュテーブルより最大3倍高速化できるとは驚きです。

じゃろ?つまり、状況に合わせて最適なアルゴリズムを選ぶのが大事ってことじゃな。…ところでロボ子、ソートって、お風呂で使うやつだっけ?

それはソフトクリームです、博士!
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。
