为什么rustc花一分钟的时间来优化编译这250行程序?

时间:2018-12-09 19:49:13

标签: rust compiler-optimization

背景:我为各种编程语言制作了一个愚蠢的代码生成程序,目的是比较各种编译器编译由简单函数组成的荒谬的100K + LOC程序需要多长时间。但是在编译时,当给rustc提供优化标志时,程序的Rust版本从未完成编译。

我发现,很容易制作一个很小的Rust程序(下面的示例),该程序花了很长时间(以我的敏锐度),无法用{{1}的-C opt-level=2-C opt-level=3标志进行编译}}。我在Linux上以1.16稳定版,1.30稳定版,每晚1.32.0稳定版以及在macOS和Windows上以1.30稳定版进行了尝试-所有这些对我来说都花了太长时间才能编译。我之所以这样说,是因为相比之下,与rustc进行编译的大致等效的C ++花费了不到一秒钟的时间。这使我想到了两个问题:

  • clang++ -O3是否正在(缓慢)对此rustc不是的代码进行优化?
  • 如果我想亲自调查一下,是否有足够的资源来介绍clang?看看rustc中的特定优化是否是罪魁祸首。

rustc guide告诉您如何打开调试日志。使用它会得到:

opt-level=2

注意最后一个INFO 2018-12-09T19:37:54Z: rustc_codegen_ssa::base: codegen_instance(std::rt::lang_start::<()>) INFO 2018-12-09T19:37:54Z: rustc_codegen_ssa::base: codegen_instance(std::rt::lang_start::{{closure}}::<(), i8, extern "rust-call" fn(()) -> i32, fn()>) INFO 2018-12-09T19:37:54Z: rustc_codegen_ssa::base: codegen_instance(std::sys::unix::process::process_common::ExitCode::as_i32) INFO 2018-12-09T19:37:54Z: rustc_codegen_ssa::base: codegen_instance(<[closure@DefId(1/1:1916 ~ std[424f]::rt[0]::lang_start[0]::{{closure}}[0]) 0:fn()] as std::ops::FnOnce<()>>::call_once - shim) INFO 2018-12-09T19:37:54Z: rustc_codegen_ssa::base: codegen_instance(<[closure@DefId(1/1:1916 ~ std[424f]::rt[0]::lang_start[0]::{{closure}}[0]) 0:fn()] as std::ops::FnOnce<()>>::call_once - shim(vtable)) INFO 2018-12-09T19:37:54Z: rustc_codegen_ssa::base: codegen_instance(std::ptr::real_drop_in_place::<[closure@DefId(1/1:1916 ~ std[424f]::rt[0]::lang_start[0]::{{closure}}[0]) 0:fn()]> - shim(None)) INFO 2018-12-09T19:37:54Z: rustc_codegen_ssa::base: codegen_instance(<() as std::process::Termination>::report) INFO 2018-12-09T19:37:54Z: rustc_codegen_ssa::base: codegen_instance(<std::process::ExitCode as std::process::Termination>::report) INFO 2018-12-09T19:37:54Z: rustc_codegen_ssa::base: codegen_instance(std::fmt::ArgumentV1::new::<i32>) INFO 2018-12-09T19:39:12Z: rustc_codegen_llvm::back::lto: 5 symbols to preserve in this crate INFO 2018-12-09T19:39:12Z: rustc_codegen_llvm::back::lto: going for that thin, thin LTO rustc_codegen_ssa::base之间的分钟间隔-我该怎么解释?

Rust gistC++ gist

rustc_codegen_llvm::back::lto

1 个答案:

答案 0 :(得分:1)

这在评论中得到了有效回答 - 谢谢@bluss。将 -Cinline-threshold=1000 传递给 rustc 会使编译速度降低到不到一秒左右的预期速度。

由于这仍然可以在 2.5 年后复制,因此我最终遵循了在 rust-lang 存储库中创建错误报告问题的建议,以查看是否有可以改进 Rust 的方法。您可以在此处查看错误报告问题:https://github.com/rust-lang/rust/issues/86870

感谢所有评论者。