Rust | LTO和Thin LTO编译器

Apr 15, 2025

链接时优化是一种编译器优化技术,它在程序的链接阶段而非传统的编译阶段执行代码优化。

LTO 的工作原理

  1. 编译阶段:编译器在编译单个源文件时,不仅生成机器代码,还保存中间表示(IR,Intermediate Representation)到目标文件中
  2. 链接阶段:链接器收集所有模块的IR,将它们合并为一个统一的程序表示
  3. 全局优化:对整个程序执行优化,基于对所有代码的完整视图

LTO 的主要优势

  • 跨模块优化:可以进行跨越多个源文件的优化
  • 内联函数:更强大的函数内联能力,包括跨编译单元边界
  • 死代码消除:更有效地移除未使用的代码
  • 更精确的别名分析:改进指针分析和内存访问优化
  • 代码大小减少:通过移除不必要的代码减小二进制大小

LTO 的缺点

  • 内存消耗大:处理大型程序时需要大量内存
  • 编译时间长:链接过程变得更加复杂和耗时

Thin LTO (轻量级链接时优化)

Thin LTO 是 LLVM 编译器基础设施引入的 LTO 变种,旨在解决传统 LTO 的性能和扩展性问题。

Thin LTO 的工作原理

  1. 索引生成:每个目标文件都独立生成索引,包含符号和引用信息
  2. 并行优化:基于索引信息,将全局优化工作分解成多个可并行执行的任务
  3. 模块级优化:在各个模块上并行执行优化,而不是合并所有IR

Thin LTO 的主要优势

  • 减少内存使用:不需要加载整个程序的IR到内存
  • 并行编译:通过并行化加速编译过程
  • 增量编译支持:更好地支持增量构建
  • 保留大部分传统LTO的优化效果:仍能执行跨模块优化
特性LTOThin LTO
优化效果最大化接近LTO但略低
内存使用中等
编译速度快(尤其在多核系统)
并行度有限
适用场景最终发布构建日常开发和发布

Rust 中使用

[profile.release]
# lto = "off"
# lto = "fat"   
# lto = "thin"

LTO 通常与其他优化标志一起使用。

https://inasa.dev/posts/rss.xml