在依赖项完成类型检查之前启动依赖的 crate。每个 crate 都会等待它所依赖的 crate 被完全检查(包括函数体)之后才开始。它不需要这些函数体来对自身进行类型检查。它针对依赖项的接口(即 .rmeta 文件中的元数据)进行编译。Headstart 让 rustc 在接口检查后立即写入一个早期元数据文件,并让 cargo 基于该文件启动依赖的 crate。然后,每个 crate 的函数体在下游 crate 已经在编译时被检查。
cargo check:依赖项基于早期元数据运行至完成。cargo build:依赖项基于早期元数据完成所有分析,然后等待依赖项的完整元数据再生成代码。在等待期间,它们会交回自己的任务槽。如果某个函数体有错误,构建仍然会因该错误而失败,并产生与今天相同的诊断信息和退出状态;只有进度行和 JSON 消息的跨 crate 顺序可能不同。
代价是下游被丢弃的工作、稍晚报告的错误以及同时使用的更多内存(参见 docs/design.md)。在 rustc 的默认前端上,headstart 使 13 个真实项目(rust-analyzer、zed、bevy、lemmy、polars 等)的干净构建中,cargo check 速度提升高达 54%,cargo build 速度提升高达 42%。没有一个项目变慢。使用并行前端(-Zthreads=8,覆盖了部分相同领域)时,提升幅度高达 25%。这些是 16 核的数据。
来源: Hacker News · 由HeadlinesBriefing整理摘要