始终将RUST_BACKTRACE=1设置为合理吗?
在正常执行期间(例如在函数调用期间)是否会引入任何(显着的)开销,还是只有在发生恐慌时才会有开销?
RUST_BACKTRACE
的位置是函数 sys_common::backtrace::log_enabled()
。该函数仅从 panicking::default_hook
调用,后者会在出现 panic 后调用。因此,除非线程发生 panic,否则设置它不应对性能产生影响。rustc
)。当编译错误时,编译器有时会引发 panic 以进行“正常”退出,抑制打印回溯但仍计算其结果。过去,人们曾报告说这会导致某些版本的编译器设置 RUST_BACKTRACE=1
后需要长时间才能退出。RUST_BACKTRACE
:例如,error_chain
crate 在生成错误并设置 RUST_BACKTRACE=1
时会生成回溯。这可能会减慢使用该 crate 的项目。使用 error_chain
的著名项目是 cargo
。我在#rust-internals
里询问了这个问题,sfackler
说:
我认为除了在恐慌时没有任何影响。
对我来说这很有意思,因为Rust Playground希望始终启用RUST_BACKTRACE
,但目前速度差异不可忽略。自Rust 1.19.0以来,即使是一个简单的“hello world”程序,也会有一些开销,它既不会引发恐慌,也不会导致编译器错误:
| RUST_BACKTRACE | time (seconds) |
|---------------------|----------------|
| compile and execute | 2.48 |
| execute | 2.02 |
| disabled | 1.64 |
RUST_BACKTRACE=1 cargo run
CARGO_TARGET_X86_64_UNKNOWN_LINUX_GNU_RUNNER='env RUST_BACKTRACE=1' cargo run
cargo run
这种开销随时间的推移并不一致;在1.14.0中,仅启用它会导致某些平台上延迟10-20秒!在那之前,我从未注意到任何缓慢。
RUST_BACKTRACE
时编译的Rust代码性能目前不是Rust团队的主要关注点。除此之外还有许多其他有趣的事情需要评估!出于这些原因,我不愿意一直开启它。当然,如果编译器本身默认打开该设置,那么我会期望它更值得关注!RUST_BACKTRACE
似乎会减慢 rustc(即使没有错误)和 cargo(即使不需要重新编译)。然而,一个简单的 hello world 程序无论是否设置该选项,运行时间都应该接近于 0。 - interjay
RUST_BACKTRACE
比不使用它更慢-基准。该程序是以完全相同的配置(使用 Docker)从头编译的,我唯一变化的是何时设置“RUST_BACKTRACE”变量-这是我表格中的3种情况。数据的变异性也非常低。 - Shepmaster