bigywater.tech
Rust · 129

增量编译

增量编译到底省多少时间,又付出了什么?为什么 release 默认关着?这篇用一个 5000 个函数的 crate,在 dev 和 release 里分别开关增量,量出重编时间与磁盘占用。

3.2×
dev 里改一个函数体,增量对非增量的重编加速比
132.9 MB
这个 crate 的 target/debug/incremental 大小
3.32 → 0.77 s
release 里改一处:默认与强制开启增量

增量开与关

实测 · 本机执行输出
  CARGO_INCREMENTAL=1(dev 默认)      首次  3.05 s   没改动  0.08 s   改一个函数体后  0.77 s(3 次最小)   target/debug/incremental 大小 132.9 MB
  CARGO_INCREMENTAL=0              首次  2.55 s   没改动  0.08 s   改一个函数体后  2.48 s(3 次最小)   target/debug/incremental 大小 0.0 MB

各个编译阶段见Rust 编译阶段;构建配置见Cargo Profile。

release 与增量

实测 · 本机执行输出
  release 默认(无增量)                  首次  3.34 s   改一个函数体后  3.32 s
  release + CARGO_INCREMENTAL=1    首次  3.84 s   改一个函数体后  0.77 s

数字是本机的实测(只改动一个模块里的一个函数体,3 次或 2 次取最小);修改被很多地方依赖的类型定义时,增量的收益会小得多,没有测。

分步演示

增量编译
本步的对象

    本文用到的工具与边界

    • 本机 macOS 27 arm64 / rustc 1.98.1(brew)/ cargo 1.98.1;单个文件用 rustc 直接编译,需要依赖时用 cargo(经代理从 crates.io 下载);计时用 std::time::Instant,数字每次运行会有小幅抖动。crate 是生成的 5000 个小函数,没有外部依赖
    • 没有验证:修改公共类型或 trait 定义时的重编时间、增量编译产物与全量产物的运行速度差异、rust-analyzer 与 cargo 共用增量缓存的情况、sccache 的效果、-Z threads 并行前端
    京ICP备2026067502号-1京公网安备11010502063487号