LTO は Link Time Optimization の略です。通常のコンパイラーの最適化は単一のモジュールに閉じた範囲での最適化になりますが、LTO は連携編集(リンク)時に関連するモジュールも含めた範囲で最適化を実施する手法です。
効果としては出来上がるモジュールのサイズが小さくなったり、処理速度の向上が見込めるとのことですが、連携編集にはだいぶ時間がかかるようになります。
きっかけ
LTO の存在自体は知っていましたが、連携編集に相当な時間がかかるようで敬遠していました。普段は Linux kernel のカスタムビルドに 1 時間かからないくらいで済んでいるのですが、これに LTO を適用するメリットというかコストパフォーマンスが不明だったからです。
ちょうど LMDE に Linux kernel 6.12.33 が配信されたのでいつも通りにカスタムビルドを実施したのですが、make の途中で LTO を適用するかいつも尋ねられるのです。
そんな時に発見したのが以下の記事です。
ThinLTO: Scalable and Incremental LTO
なんか LTO(Full LTO)ではなく軽量である程度の効果も見込める ThinLTO を推しているように感じました。
当初は Full LTO の処理時間がどれくらいかを調べていたのですが、ThinLTO だとビルド完了までの時間が None LTO と比べて少しだけ増加するだけで、LTO の効果としては Full LTO に近いのだと読み取りました。
ちなみに Full LTO だとビルド完了までの時間は 4 倍くらいになりそうでした。
やってみた
期待を胸にはじめての LTO(ThinLTO)に挑戦してみます。
Linux kernel 6.12.33
Clang 19
LLVM(LD)19
make 時には -march=native と -O3 を指定しています。お? -O3 の指定がなかった。いつから外れてた?ということで -O3 を指定して再ビルドしました・・・。
項目 | ビルド時間 | イメージサイズ |
---|---|---|
None LTO(-O2) | 46min | 70MB |
ThinLTO(-O2) | 48min | 72.9MB |
ThinLTO(-O3) | 49min | 73.8MB |
ビルド時間は想定通りで少し増える程度で済んでいますが、なぜか出来上がった Linux kernel のイメージサイズは大きくなってしまいました。はて?
使用感
注目の処理速度を確認してみましょう。なのですが、None LTO と ThinLTO(-O2) では体感であまり差がわからず、という感じです。ThinLTO(-O3) は違いがわかるかもしれません。
ということで、ベンチマークテストを実行してみました。
まずは Motion Mark の結果です。
![]() |
None LTO(-O2) の結果 |
![]() |
ThinLTO(-O2) の結果 |
![]() |
ThinLTO(-O3) の結果 |
ThinLTO よりも -O3 の効果が出ているように見えます。
続いて Speedometer の結果です。
![]() |
None LTO の結果 |
![]() |
ThinLTO(-O2) の結果 |
![]() |
ThinLTO(-O3) の結果 |
どのパターンもあまり差は出なかったようです。
ということで、劇的な変化は見られなかったもののビルド時間にそれほど差がなかったのでこれからは ThinLTO を使っていこうかと思います。
(4 時間コースの Full LTO は試したくない・・・)