Skip to content

Release 构建优化

Debug 构建追求编译速度,Release 构建追求运行性能和包体大小。发布前必须用 --release 构建。

opt-level

opt-level 控制优化级别。Cargo 的两个默认配置:

Profileopt-level特点
dev(debug)0编译快,运行慢
release3编译慢,运行快

项目根目录的 Cargo.toml 可以覆盖默认值。本书的 workspace 配置了 Bevy 官方推荐的开发期方案:

toml
[profile.dev]
opt-level = 1

[profile.dev.package."*"]
opt-level = 3

Cargo.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。