【问题标题】:Improving Rust binary build times改进 Rust 二进制构建时间
【发布时间】: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


【解决方案1】:
  1. 使用cargo build:它实现了增量构建,因此它不会每次都构建依赖关系,而只会构建一次。第一次构建很长,所有后续构建都很快。在此之前您需要使用cargo init
  2. 使用cargo check 快速检查和修复编译错误。 cargo checkcargo build 运行得更快,因为它不执行最后的编译步骤。
  3. 属性宏(如#[derive(Serialize, Deserialize, Debug)])通常会消耗相当多的时间,因此请注意。
  4. 似乎只有一种手动方法可以识别构建时间消耗的瓶颈:删除一些依赖项并查看构建时间有何不同。
  5. 没有办法为开发指定动态链接。

【讨论】:

  • 我的构建系统不会重新构建没有更改但没有使用 --incremental 的 crate。你是这个意思吗?在调试 Cargo 时,它看起来也没有使用 --incremental
  • cargo build 应该可以正常工作...您可以尝试使用cargo check,它会显示错误但运行速度更快,因为它不会执行最终编译步骤。
猜你喜欢
  • 2021-01-26
  • 1970-01-01
  • 2012-01-27
  • 1970-01-01
  • 1970-01-01
  • 2018-02-09
  • 1970-01-01
  • 1970-01-01
  • 2017-03-05
相关资源
最近更新 更多