Debian 上提升 Rust 编译速度的可落地方案
一 基础与通用提速
- 保持工具链最新:定期执行 rustup update,新版本编译器自带大量性能修复与优化。
- 日常开发用 cargo check 替代 cargo build,只做类型与借用检查,避免生成二进制,反馈更快。
- 充分利用并行:设置 jobs = N(Cargo 并行任务数)与 RUSTC_THREADS(rustc 并行线程)。示例:开发时保留 2 核给编辑器,其余用于编译:
- 仅构建:cargo build -j $(nproc --ignore=2)
- 仅检查:cargo check -j $(nproc --ignore=2)
- 增量编译默认已开启(stable 自 2024 起),无需额外配置;若被覆盖可显式启用:
- 配置:echo ‘incremental = true’ >> .cargo/config.toml[build]
- 验证:RUSTC_LOG=info cargo build 2>&1 | grep -i incremental
- 依赖“减肥”:移除未使用依赖,减少编译与链接开销:
- cargo install cargo-machete && cargo machete
- 测试更快:用 cargo-nextest 替代 cargo test,并行执行测试,常见提速可达 ~60%。
二 缓存与链接器优化
- 编译缓存 sccache:复用已编译产物,本地与 CI 都有效。
- 安装:cargo install sccache
- 启用:export RUSTC_WRAPPER=$(which sccache)
- CI 建议缓存 $CARGO_HOME 与 target/;自建内网 sccache-server 可进一步提速。
- 清理无用缓存:cargo install cargo-cache && cargo cache --autoclean
- 更快的链接器:优先用 lld,极致用 mold。
- 使用 lld(示例为 x86_64-unknown-linux-gnu):
- .cargo/config.toml[target.x86_64-unknown-linux-gnu]
linker = “clang”
rustflags = [“-C”, “link-arg=-fuse-ld=lld”]
- 使用 mold:
- Debian 可安装 mold 后设置:export RUSTC_LINKER=mold
- 或在 config.toml 使用 rustflags = [“-C”, “linker=mold”]
- 链接阶段通常是全量构建的瓶颈,更换链接器往往能显著缩短总耗时。
三 配置与构建配置建议
- 调试构建(dev)优先速度:
- Cargo.toml[profile.dev]
opt-level = 0 # 避免手滑改成 1/2 导致变慢
debug = 1 # 仅行表,比 full 快约 30%
codegen-units = 16 # 并行 CodeGen
lto = false # dev 不开 LTO
- 发布构建(release)按需取舍:
- Cargo.toml[profile.release]
opt-level = 2 # 平衡速度与体积;极致性能用 3(更慢)
lto = “thin” # 体积与编译时长折中;fat 更慢更优
codegen-units = 1 # 优化密度更高,构建更慢
panic = “abort” # 减小体积与运行时开销
strip = true # 去除调试符号,减小产物
- 针对本机 CPU 做适度优化(可选):
- RUSTFLAGS=“-C target-cpu=native” cargo build --release
- 注意:跨机器分发二进制时慎用 native,避免指令集不兼容。
四 诊断与进阶手段
- 定位耗时依赖与 crate:
- 构建耗时分布:cargo build --timings
- 未使用依赖:cargo machete
- 深入分析编译过程:cargo rustc – -Zself-profile,用火焰图/Chrome 分析器查看热点。
- 更快的调试后端(仅 Nightly):
- rustup toolchain install nightly
- rustup component add rustc-codegen-cranelift --toolchain nightly
- 开发构建:cargo +nightly build(调试版运行性能可能下降 ~5–10%,但迭代更快)
- I/O 瓶颈场景:将 target 放到 tmpfs/RAM 磁盘(SSD 次之),如:
- mkdir -p /mnt/ramdisk && mount -t tmpfs -o size=4G tmpfs /mnt/ramdisk
- export CARGO_TARGET_DIR=/mnt/ramdisk/target
五 一键可用的最小配置示例
- 安装依赖:
- sudo apt update && sudo apt install -y clang mold
- cargo install sccache cargo-machete
- Shell 配置(~/.bashrc 或 ~/.zshrc):
- export RUSTC_WRAPPER=$(which sccache)
- export CARGO_TARGET_DIR=$HOME/.cargo/target-fast
- alias cb=‘cargo build -j $(nproc --ignore=2)’
- alias cc=‘cargo check -j $(nproc --ignore=2)’
- .cargo/config.toml:
- [build]
jobs = 16
incremental = true
- [target.x86_64-unknown-linux-gnu]
linker = “clang”
rustflags = [“-C”, “link-arg=-fuse-ld=lld”]
- Cargo.toml(片段):
- [profile.dev]
opt-level = 0
debug = 1
codegen-units = 16
lto = false
- [profile.release]
opt-level = 2
lto = “thin”
codegen-units = 1
panic = “abort”
strip = true
- 使用提示:日常开发优先 cc;全量发布用 cargo build --release;若磁盘/链接成为瓶颈,优先尝试 mold 与 RAM 磁盘。