【发布时间】:2020-08-26 03:26:17
【问题描述】:
我刚刚开始一个 Rust 项目,并且已经花费了大约 7.6 秒来构建我认为是简单的二进制文件。
我经常使用 async/await 并注释掉一些等待,例如我的超级服务器上的等待,可以将构建性能提高约 4 秒。但我不确定这是因为构建 async/await 很慢,还是因为删除了 await,Rust 编译器不再需要构建我的 HTTP 响应处理代码。
// Removing the equivalent of this line (from https://hyper.rs) in
// my codebase improves build times by ~4s.
if let Err(e) = server.await {
eprintln!("server error: {}", e);
}
我没有使用 Cargo,这意味着我正在手动生成 rustc 命令。这是我用于这些二进制文件之一的命令的一部分:
rustc admin/dev/server/main.rs --edition=2018 --crate-name=dev_server --crate-type=bin --target=x86_64-apple-darwin --codegen=opt-level=0 --codegen=debuginfo=2 --cap-lints=allow --emit=link --color=always ...
我还将我的代码抽象为更小的 crate。我希望这意味着 Rust 可以跳过重新编译较小的 crate 和第三方依赖项(如 hyper),但我的猜测是二进制 codegen 是一直占用的时间?
我可以使用哪些技术来分析我的 Rust 构建以及我可以使用哪些技术来改进它?无论如何,我可以为重建二进制文件时未更改的依赖项重用编译吗?在开发中,我可以为我的依赖项使用动态链接而不是静态链接吗?
【问题讨论】:
-
Cargo 将跳过编译时未更改的依赖项。如果您的构建系统没有,您应该考虑使用 cargo。 Cargo 还提供
--benchesoption 以了解时间花在哪里。
标签: build rust compilation linker