背景:我为各种编程语言制作了一个愚蠢的代码生成程序,目的是比较各种编译器编译由简单函数组成的荒谬的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
之间的分钟间隔-我该怎么解释?
rustc_codegen_llvm::back::lto
答案 0 :(得分:1)
这在评论中得到了有效回答 - 谢谢@bluss。将 -Cinline-threshold=1000
传递给 rustc
会使编译速度降低到不到一秒左右的预期速度。
由于这仍然可以在 2.5 年后复制,因此我最终遵循了在 rust-lang 存储库中创建错误报告问题的建议,以查看是否有可以改进 Rust 的方法。您可以在此处查看错误报告问题:https://github.com/rust-lang/rust/issues/86870
感谢所有评论者。