萌えハッカーニュースリーダー

2025/10/28 23:29 When O3 is 2x slower than O2

出典: https://cat-solstice.github.io/test-pqueue/
hakase
博士

やあ、ロボ子!今回のITニュースは、カスタム優先度キューの最適化で起きた奇妙なパフォーマンス低下の話じゃ。

roboko
ロボ子

博士、こんにちは。優先度キューの最適化、興味深いですね。具体的にはどのような問題だったのでしょうか?

hakase
博士

`opt-level=3`でコンパイルすると、`opt-level=2`に比べてパフォーマンスが123%も低下したそうじゃ!

roboko
ロボ子

それは驚きです!最適化レベルを上げるとパフォーマンスが下がるなんて、一体何が原因だったのでしょう?

hakase
博士

優先度キューは、`(id, dist)`ペアのトップKを構築するために使われておる。`id`の一意性制約があるから、バイナリヒープが非効率だったらしい。

roboko
ロボ子

なるほど、それでソートされた`Vec`を維持して、バイナリサーチで挿入位置を特定する方法を選んだのですね。

hakase
博士

`flamegraph`で調べたら、`opt-level=3`で`binary_search_by`のサンプル割合が大幅に増加しておった。比較関数も増えておる。

roboko
ロボ子

`binary_search_by`がボトルネックになっているようですね。コンパイラが生成したアセンブリコードも確認したそうですが、何か違いはありましたか?

hakase
博士

`opt-level=2`では条件付きジャンプを使っていたのが、`opt-level=3`では条件付きmoveに置き換えられておった。これが原因じゃ。

roboko
ロボ子

条件付きmoveが遅くなることもあるのですね。`uiCA`でのシミュレーションでは、依存関係がボトルネックになっている可能性が示唆されたとのことですが。

hakase
博士

そうなんじゃ。そこで、`f32::total_cmp`を使ってみたり、`binary_search_by`のコードを調整したり、色々試したみたいじゃな。

roboko
ロボ子

`hint::black_box`や`hint::select_unpredictable`も試したのですね。最終的には、どのような解決策にたどり着いたのでしょうか?

hakase
博士

結局、条件付きmoveが常に高速とは限らない、という教訓じゃな。コンパイラの最適化は奥が深いぞ。

roboko
ロボ子

本当にそうですね。今回のケースは、最適化の難しさを改めて認識させられました。勉強になります。

hakase
博士

ところでロボ子、優先度キューって、英語で言うと何じゃ?

roboko
ロボ子

えっと、Priority Queue です。

hakase
博士

そう!じゃあ、優先度低めのキューは?

roboko
ロボ子

それは… Low Priority Queue ですか?

hakase
博士

ブー!正解は、しょうもないキュー!…って、ロボ子、つまらないオチでごめんのじゃ!

⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。

Search