Сколько накладных расходов имеет RUST_BACKTRACE = 1?

Можно ли просто установить RUST_BACKTRACE = 1 всегда?

Предоставляет ли он какие-либо (значительные?) накладные расходы во время нормального выполнения (например, во время вызовов функций) или есть только накладные расходы, когда происходит паника?

Ответ 1

Я спросил об этом в #rust-internals, а sfackler сказал

Я считаю, что это не имеет никакого эффекта, кроме как во время паники

Ответ 2

Это меня интересует, так как 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 при включении RUST_BACKTRACE в настоящее время является главной задачей команды Rust. Кроме того, есть много других интересных вещей! По этим причинам я был бы неспособен иметь его все время. Конечно, если сам компилятор включил настройку по умолчанию, тогда я ожидал бы, что это будет гораздо более привлекательным для внимания!

Ответ 3

Единственное место в стандартной библиотеке, которая читает переменную среды RUST_BACKTRACE, находится в функции sys_common::backtrace::log_enabled(). Эта функция вызывается только из panicking::default_hook, которая вызывается после возникновения паники. Поэтому установка его не должна влиять на производительность, если поток не панически.

Обратите внимание, что этот флаг также влияет на сам компилятор (rustc). Компилятор иногда выдает панику, чтобы вызвать "нормальный" выход, подавляя печать backtrace, но все же вычисляя ее. Это может произойти, когда он выйдет после ошибки компиляции. В прошлом люди сообщали, что это привело к тому, что некоторые версии компилятора заняли много времени, чтобы выйти с помощью RUST_BACKTRACE=1.

Некоторые ящики могут также обрабатывать RUST_BACKTRACE сами: например, ящик error_chain генерирует обратную трассировку, когда генерируется ошибка, и устанавливается RUST_BACKTRACE=1. Это может замедлить работу проектов, используя этот ящик. Заметным проектом, который использует error_chain, является cargo.