bigywater.tech
Rust · 128

LTO 与二进制体积

想让 Rust 二进制变小,常见招数有 strip、LTO、panic = abort、opt-level = "z"。每一招到底省多少、编译时间涨多少、有没有反效果?这篇在同一个真实依赖的程序上逐项实测。

57%
全套瘦身配置的二进制大小占默认的比例
-24%
strip = true 单独带来的体积变化
s / z 更大
opt-level = "s" 与 "z" 在这个程序里的结果

各项配置的体积

实测 · 本机执行输出
  配置                                    大小(字节)    相对默认    编译(s)    运行(ms)
  release(默认)                          587,312    1.00      4.3       4.7
  + strip = true                       447,856    0.76      4.1       4.0
  + lto = "thin"                       576,336    0.98      5.9       5.9
  + lto = "fat"                        492,240    0.84      6.5       6.7
  + lto fat + codegen-units = 1        489,600    0.83      6.5       4.7
  + panic = "abort"                    536,320    0.91      4.4       6.8
  + opt-level = "s"                    611,360    1.04      3.8       4.8
  + opt-level = "z"                    619,840    1.06      3.7       5.7
  全套:fat+cgu1+abort+z+strip            336,752    0.57      5.9       6.9

Cargo profile 的完整配置见Cargo Profile;更细的体积分析见二进制体积分析。rayon 1.x 从 crates.io 下载。

分步演示

LTO 与二进制体积
本步的对象

    本文用到的工具与边界

    • 本机 macOS 27 arm64 / rustc 1.98.1(brew)/ cargo 1.98.1;单个文件用 rustc 直接编译,需要依赖时用 cargo(经代理从 crates.io 下载);计时用 std::time::Instant,数字每次运行会有小幅抖动。每个变体全量重编;运行时间是该进程 5 次中的最小值
    • 没有验证:opt-level s/z 变大的原因、upx 压缩、-Z build-std、不同程序(无依赖 / 大依赖)上的结果差别、LTO 对运行速度的影响(这个微小程序里量不出)
    京ICP备2026067502号-1京公网安备11010502063487号