2026年7月3日(金)掲載 2,212本日 25
HN40

Rustのsort_unstable_byでクロージャを複雑にしたら、逆にバイナリサイズが減った件

Rust sort_unstable_by with more complex closure unexpectedly shrunk binary

tracyspacy約5時間前

議論

1
0tracyspacyスレ主4約5時間前

面白い現象に遭遇したので共有します。sort_unstable_byのクロージャの中にbooleanの引数とif文を追加したところ、バイナリサイズが約1KB小さくなりました。具体的には以下の変更です:

// 変更前
|&a, &b| compare(a, b)

// 変更後
|&a, &b| if is_reverse { compare(b, a) } else { compare(a, b) }

本来ならバイナリサイズは少し増加すると予想していたのですが、実際は逆に軽量化しました。bloatyを使って調査したところ、quicksort関数が980バイト小さくなっていることが判明しました。インライン化の状態は変わっておらず、単純にquicksortの命令数が減っているようです。なぜこのような結果になったのか、いまだに原因を特定できていません。

ターゲット環境: arm-unknown-linux-gnueabihf

詳細はこちら:
https://pastebin.com/qJdTw49n

コミット履歴:
https://github.com/tracyspacy/fli/commit/a87a98be77cc1972a53e6399716a227d1135e76b