Debugging RUST_BACKTRACE=1有多少开销?

Debugging RUST_BACKTRACE=1有多少开销?,debugging,rust,Debugging,Rust,始终将RUST_BACKTRACE设置为1是否合理 它在正常执行期间(例如在函数调用期间)会引入任何(显著的)开销吗?还是只有在发生恐慌时才会有开销?我在#rust internals中问到了这一点,而sfackler说 我相信它除了在恐慌期间没有任何效果 这和铁锈操场一样让我感兴趣,但目前速度差还不够小。从Rust 1.19.0开始,即使是一个简单的“hello world”程序也会有一些开销,它不会死机或导致编译器错误: |生锈回溯|时间(秒)| |---------------------

始终将RUST_BACKTRACE设置为1是否合理


它在正常执行期间(例如在函数调用期间)会引入任何(显著的)开销吗?还是只有在发生恐慌时才会有开销?

我在
#rust internals
中问到了这一点,而
sfackler

我相信它除了在恐慌期间没有任何效果


这和铁锈操场一样让我感兴趣,但目前速度差还不够小。从Rust 1.19.0开始,即使是一个简单的“hello world”程序也会有一些开销,它不会死机或导致编译器错误:

|生锈回溯|时间(秒)|
|---------------------|----------------|
|编译并执行| 2.48|
|执行| 2.02|
|残疾| 1.64|
  • 编译并执行-
    RUST\u BACKTRACE=1货物运行
  • 执行-
    货物运行
    CARGO\u TARGET\u X86\u 64\u UNKNOWN\u LINUX\u GNU RUNNER='env RUST\u BACKTRACE=1'货物运行
  • 禁用-
    货物运行
随着时间的推移,开销并不一致;在1.14.0中,只需启用它!在此之前,我从未注意到任何缓慢



编辑方面,Rust团队目前主要关注的问题似乎不是启用
Rust\u BACKTRACE
时编译的Rust代码的性能。除此之外,还有许多其他有趣的事情需要评估!出于这些原因,我不愿意一直戴着它。当然,如果编译器本身在默认情况下打开了该设置,那么我希望它更值得注意

标准库中读取
RUST\u BACKTRACE
环境变量的唯一位置是函数中。该函数仅从调用,在恐慌发生后调用。因此,设置它应该不会影响性能,除非线程崩溃

请注意,此标志还影响编译器本身(
rustc
)。编译器有时会发出恐慌以导致“正常”退出,禁止打印回溯,但仍在计算回溯。这可能发生在编译错误后退出时。过去,有人报告说,这导致编译器的某些版本需要很长时间才能退出并设置
RUST\u BACKTRACE=1
set


一些板条箱也可以自行处理
RUST\u BACKTRACE
:例如,
error\u chain
板条箱在生成错误且设置了
RUST\u BACKTRACE=1
时会生成一个回溯。这会减慢使用此板条箱的项目的速度。使用
error\u chain
的一个著名项目是
cargo

,那么为什么不一直为所有调试构建启用它呢?它是一个环境变量。所以设置来自外部,而不是内部。我知道它是一个环境变量。我在问,为什么不让在调试模式下编译的任何rust exe的行为始终具有
rust\u BACKTRACE=1
的行为,而不考虑环境变量。我不知道,这样至少已经3年了。因此,设置它应该不会对性能产生任何影响,除非线程恐慌-知道为什么这个语句不同意吗?@Shepmaster测试中的变量太多了:您正在测量browser+webserver+cargo+编译+运行的时间。所有这些大概都是在一个沙箱中运行的,这可能会减慢速度。您是否尝试只运行可执行文件进行测试?您是正确的,我的测试包括browser+webserver,但这些是运行过程中的常量,并且针对我的本地计算机,没有发生任何其他情况。在Docker容器中运行也是一个常量。注意,我并不是说整个过程是慢还是快,只是说使用
RUST\u BACKTRACE
比不使用基线慢。该程序是在完全相同的配置(yay Docker)下从头开始编译的,我唯一的不同之处是设置了
RUST\u BACKTRACE
变量-表中的3种情况。数据的差异也很小。你的结果是在自己的基础上衡量的吗?(我不知道一个hello world项目怎么会花这么长时间)。如果是这样的话,时间是否会随着服务器当前的繁忙程度而剧烈波动?@interjay查看测试方法。Docker参与了,是的,但我的本地系统上没有其他负载。我已经做了一些测试,
RUST\u BACKTRACE
似乎会减慢rustc(即使没有错误)和cargo(即使不需要重新编译)。但是,hello world程序在有或没有此设置的情况下运行大约需要0个时间。@interjay有趣-我意识到我为执行行粘贴了错误的执行字符串。固定版本似乎仍然不应该触发您识别的任何一种情况。我不确定还会是什么。。。