RUST_BACKTRACE = 1有多少开销?

aij*_*aij 11 debugging rust

总是设置RUST_BACKTRACE = 1是否合理?

它是否在正常执行期间(例如在函数调用期间)引入任何(重要的?)开销,或者在发生恐慌时是否只有开销?

Ste*_*nik 8

我问了这个#rust-internalssfackler

我相信它除了在恐慌期间没有任何影响

  • 我知道它是一个环境变量。我在问,为什么不让在调试模式下编译的任何 rust exe 的行为始终具有“RUST_BACKTRACE=1”的行为,而不管环境变量如何。 (6认同)

She*_*ter 6

这对我很感兴趣,因为 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 |
Run Code Online (Sandbox Code Playgroud)
  • 编译并执行-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 团队目前最关心的问题。除此之外,还有许多其他有趣的事情需要评估!由于这些原因,我不愿意一直戴着它。当然,如果编译器本身默认开启了该设置,那么我希望它更值得关注!


int*_*jay 5

函数中是标准库中唯一读取RUST_BACKTRACE环境变量的位置sys_common::backtrace::log_enabled()。该函数只能panicking::default_hook从中调用,而在发生恐慌后才调用该函数。因此,除非线程出现紧急情况,否则对其进行设置应该不会对性能产生任何影响。

请注意,此标志还会影响编译器本身(rustc)。编译器有时会发出紧急情况以导致“正常”退出,从而抑制打印回溯,但仍在对其进行计算。当它在编译错误后退出时,可能会发生这种情况。过去,有人报告说,这导致某些版本的编译器需要很长时间才能退出RUST_BACKTRACE=1set。

一些板条箱也可以处理RUST_BACKTRACE它们自己:例如,在error_chain生成并RUST_BACKTRACE=1设置错误时,板条箱会生成回溯。这可能会降低使用此板条箱的项目的速度。使用的一个值得注意的项目error_chaincargo

  • 你是对的,我的测试包括浏览器+网络服务器,但这些是运行过程中的常量,并且针对我的本地计算机,没有发生任何其他事情。在 Docker 容器内运行也是一个常数。请注意,我并不是想说整个过程是“慢”或“快”,只是说使用“RUST_BACKTRACE”比不使用“慢”——基线。该程序是在完全相同的配置(是的 Docker)中从头开始编译的,唯一不同的是设置“RUST_BACKTRACE”变量的时间——我表中的 3 种情况。数据的方差也非常低。 (2认同)