Speed & Performance
Links:
- https://bencher.dev/learn/benchmarking/rust/criterion/
- https://bheisler.github.io/criterion.rs/book/criterion_rs.html
- https://github.com/flamegraph-rs/flamegraph
- https://rust.nizeclub.ru/_29.html
- https://doc.rust-lang.org/cargo/reference/profiles.html
- https://github.com/apollographql/rust-best-practices/blob/main/book/chapter_03.md
- https://docs.rs/divan/latest/divan/
Существует две основные категории программных бенчмарков: микро-бенчмарки и макро-бенчмарки. Микро-бенчмарки работают на уровне, аналогичном модульным тестам. Макро-бенчмарки работают на уровне, аналогичном интеграционным тестам.
В целом, лучше всего тестировать на максимально низком уровне абстракции. В случае бенчмарков это делает их более простыми в поддержке и помогает уменьшить количество шума в измерениях. Однако, как и наличие некоторых сквозных тестов может быть очень полезным для проверки того, что вся система работает как ожидается, так и наличие макро-бенчмарков может быть очень полезным для обеспечения того, чтобы критические пути в вашем программном обеспечении оставались производительными.
std::time для быстрого замера
Для более точного замера следует собирать код с cargo run --release ключом.
Criterion
В Cargo.toml надо добавить зависимости:
Далее в проекте создать папку и файл benches\my_benchmark.rs:
Для запуска тестов необходима команда cargo bench. Результаты замеров сохраняются и сравниваются с новыми результатами после внесения изменений.
flamegraph - визуализация стека вызовов
flamegraph — это инструмент для создания интерактивных SVG-диаграмм, которые визуализируют стек вызовов и время, затраченное в каждой функции. Он строится на основе данных от perf (xctrace в macOS) и помогает быстро понять, где сосредоточена нагрузка.
Установка:
Для того, чтобы видеть заголовки запускаемых функций (не их хэши), нужно в файле cargo.toml добавить профиль разработки. При этом профилирование скорости нужно проводить в режиме release со всеми оптимизациями, поэтому следует сделать отдельный профиль под release, но с debug-символами:
Использование: