Можно ли просто установить RUST_BACKTRACE = 1 всегда?
Предоставляет ли он какие-либо (значительные?) накладные расходы во время нормального выполнения (например, во время вызовов функций) или есть только накладные расходы, когда происходит паника?
Можно ли просто установить RUST_BACKTRACE = 1 всегда?
Предоставляет ли он какие-либо (значительные?) накладные расходы во время нормального выполнения (например, во время вызовов функций) или есть только накладные расходы, когда происходит паника?
Я спросил об этом в #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 при включении RUST_BACKTRACE
в настоящее время является главной задачей команды Rust. Кроме того, есть много других интересных вещей! По этим причинам я был бы неспособен иметь его все время. Конечно, если сам компилятор включил настройку по умолчанию, тогда я ожидал бы, что это будет гораздо более привлекательным для внимания!
Единственное место в стандартной библиотеке, которая читает переменную среды 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
.