外观
第 4 节:dev 与 release——同一个程序,两个世界
症状
"我的程序好慢!"——等等,你跑的是 cargo run 还是 cargo run --release?
诊断
第 12 章讲过 dev/release 两种模式,但很多人低估了差距。实测(同一份代码,5000 万次整数运算):
实测数据
text
dev 模式:1.04 秒
release 模式:0.052 秒
差距:20 倍20 倍! 不是 20%,是 20 倍。dev 模式几乎不做优化(为的是编译快、好调试);release 模式把优化拉满。
解药
解药一:性能比较/验收/上线,一律 release:
bash
cargo run --release # 跑优化版
cargo build --release # 编译优化版(产物在 target/release/)解药二:用真实环境测:dev 模式测出的"慢",先切 release 再看——很多时候"性能问题"根本不存在。
解药三:优化配置可以再压榨(Cargo.toml):
toml
[profile.release]
opt-level = 3 # 优化拉满(默认已经是 3)
lto = true # 跨 crate 链接时优化(编译变慢,运行更快)
codegen-units = 1 # 一个代码生成单元(优化更好,编译更慢)别过度调优
lto = true + codegen-units = 1 换来的可能只是 2~5%,代价是编译时间暴涨。先用默认 release 跑,真不够再开——又回到总纲:先测,再优化。
预防
- "慢"的报告先问一句:你是用什么模式跑的?——一半的"性能问题"死在 dev 模式下
- CI/发布用 release:
cargo build --release是发布的标配(第 12 章) - 测试用 dev 没问题:
cargo test默认 dev(编译快),测试关注正确性不关注速度 - release 下行为可能不同:整数溢出在 dev 会 panic、release 会"环绕"(第 2 章
wrapping的亲戚)——测试要在 dev 和 release 各跑一遍(尤其涉及大数运算时)