Skip to content
TopicTracker
出典 HackerNews原文を表示
翻訳言語翻訳言語

より複雑なクロージャを渡したらRustのsort_unstable_byのバイナリが予想外に縮小

Rustの`sort_unstable_by`に渡すクロージャで、単純な比較から分岐付きの比較に変更したところ、バイナリサイズが約1KB縮小する現象が起きた。クイックソート関数自体が980バイト小さくなったことが原因で、インライン展開は変わらず、単純に命令数が減っていた。Hacker Newsの投稿では、ARMターゲットで確認されたこの意外な結果について詳細が共有されている。

背景メモ

- Rust の `sort_unstable_by` は標準ライブラリが提供する安定ソートではない(非安定)ソート関数で、内部的にクイックソートの派生アルゴリズムを使っている。 - クロージャ(closure)とは、周囲の変数を「閉じ込めて」持ち運べる無名関数。引数として渡すことでソートの比較ロジックをカスタマイズできる。 - この投稿者は、比較用クロージャに `is_reverse`(反転フラグ)の条件分岐を追加したところ、バイナリサイズが逆に縮小(約1KB減)したと報告している。直感ではコードが増えればサイズも増えるはずだが、コンパイラの最適化(LLVMバックエンド)が条件分岐を含むクロージャを別の形でインライン化・単純化した結果、より少ない命令数に帰着した可能性がある。 - 対象アーキテクチャは ARM(32ビット、ハードウェア浮動小数点)。アーキテクチャによってコンパイラの最適化の効き方や命令サイズは異なる。 - 投稿者はバイナリサイズ解析ツール bloaty を使って、縮小の原因がクイックソート関数自体の命令数減少であることを特定している。

関連記事