Release 构建优化
Debug 构建追求编译速度,Release 构建追求运行性能和包体大小。发布前必须用 --release 构建。
opt-level
opt-level 控制优化级别。Cargo 的两个默认配置:
| Profile | opt-level | 特点 |
|---|---|---|
dev(debug) | 0 | 编译快,运行慢 |
release | 3 | 编译慢,运行快 |
项目根目录的 Cargo.toml 可以覆盖默认值。本书的 workspace 配置了 Bevy 官方推荐的开发期方案:
toml
[profile.dev]
opt-level = 1
[profile.dev.package."*"]
opt-level = 3Cargo.toml:dev profile 配置——自身代码 O1、依赖 O3
这样你的代码保持 O1(编译快、可调试),而依赖库用 O3(运行快)。
LTO
链接时优化(Link-Time Optimization)在链接阶段跨 crate 内联和优化,能显著提升运行性能并减小包体,但会大幅增加链接时间。
toml
[profile.release]
lto = "fat" # 全量 LTO,效果最好,链接最慢
# lto = "thin" # 增量 LTO,折中方案
# lto = false # 不做 LTO(默认)"fat" LTO 在 CI 构建中推荐——反正不占用开发者本机时间。
strip
去除二进制中的调试符号和符号表,减小包体:
toml
[profile.release]
strip = true调试信息对发布版无用,strip = true 可以让 Windows 的 .exe 和 Linux 的二进制小 30%—50%。
codegen-units
codegen-units 控制编译并行度。值越小优化越好(因为更多代码在同一个编译单元中可见),但编译越慢:
toml
[profile.release]
codegen-units = 1 # 最佳优化,最慢编译默认值 16,设为 1 可以再挤出几个百分点的性能。
完整的 Release 配置
toml
[profile.release]
opt-level = 3
lto = "fat"
strip = true
codegen-units = 1用代码检测构建配置
rust
fn show_build_info(mut query: Query<&mut Text>) {
for mut text in &mut query {
// cfg! 宏在编译期求值,零运行时开销
let profile = if cfg!(debug_assertions) {
"Debug"
} else {
"Release"
};
let opt_level = if cfg!(debug_assertions) {
"opt-level = 1(dev)"
} else {
"opt-level = 3(release)"
};
**text = format!(
"构建配置:{}\n优化等级:{}\n目标平台:{}",
profile,
opt_level,
std::env::consts::OS,
);
}
}Listing 38-1:用 cfg! 宏在运行时检测构建配置
console
cargo run -p ch38-publishing # Debug 构建
cargo run -p ch38-publishing --release # Release 构建对比两者的输出和帧率差异。
构建时间 vs 运行性能
| 配置 | 编译时间 | 运行性能 | 包体大小 |
|---|---|---|---|
| opt-level=0, no LTO | 最快 | 最差 | 最大 |
| opt-level=1, no LTO | 快 | 一般 | 大 |
| opt-level=3, no LTO | 慢 | 好 | 中 |
| opt-level=3, fat LTO, strip, codegen-units=1 | 最慢 | 最佳 | 最小 |
日常开发用 dev profile,发布前切 release。