[英]How much overhead does RUST_BACKTRACE=1 have?
总是设置RUST_BACKTRACE = 1是否合理?
它是否在正常执行期间(例如在函数调用期间)引入任何(重要的?)开销,或者在发生恐慌时是否只有开销?
我在#rust-internals
询问过这个问题,而sfackler
说
我相信除了恐慌时它没有任何效果
标准库中唯一读取RUST_BACKTRACE
环境变量的位置在函数sys_common::backtrace::log_enabled()
。 该函数仅从panicking::default_hook
调用,在发生恐慌后调用。 因此,除非线程发生混乱,否则设置它应该对性能没有影响。
请注意,此标志也会影响编译器本身( rustc
)。 编译器有时会发出恐慌以导致“正常”退出,抑制打印回溯但仍在计算它。 在编译错误后退出时会发生这种情况。 在过去,人们已经报道这导致编译器的某些版本需要很长时间才能退出并使用RUST_BACKTRACE=1
设置。
一些crate也可以自己处理RUST_BACKTRACE
:例如, error_chain
crate在生成错误并设置RUST_BACKTRACE=1
时生成回溯。 这可能会减慢使用此箱子的项目速度。 使用error_chain
一个值得注意的项目是cargo
。
这对我很感兴趣,因为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团队的主要关注点。 除此之外,还有许多其他有趣的东西需要评估! 由于这些原因,我不愿意一直这样做。 当然,如果编译器本身在默认情况下打开了设置,那么我希望它会更受关注!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.