Профилирование
Сборка oxlint в release с отладочной символикой
Для профилирования соберите бинарник oxlint в режиме release с отладочной информацией:
cargo build --profile release-with-debug --bin oxlintБинарник: ./target/release-with-debug/oxlint — его и нужно использовать при профилировании.
CPU — Samply
Samply — профилировщик CPU из командной строки с UI Firefox Profiler. Работает на macOS и Linux.
samply record ./target/release-with-debug/oxlint .Полезные опции:
oxlint:--silentубирает диагностики из вывода.oxlint:--threads 1— один поток, проще анализировать однопоточную часть.samply record --rate <число>— выше частота выборки (по умолчанию 1000 Гц); файл профиля станет больше.
Пример однопоточного запуска с шагом 0.1 мс:
samply record --rate 10000 ./target/release-with-debug/oxlint --silent --threads 1 .CPU — Xcode Instruments (Mac)
cargo instruments — обёртка над Xcode Instruments.
Установите инструменты командной строки:
xcode-select --installУбедитесь, что бинарник собран (см. выше).
Под капотом вызывается примерно:
xcrun xctrace record --template 'Time Profile' --output . --launch -- /path/to/oxc/target/release-with-debug/oxlintПример вывода:
Starting recording with the Time Profiler template. Launching process: oxlint.
Ctrl-C to stop the recording
Target app exited, ending recording...
Recording completed. Saving output file...
Output file saved as: Launch_oxlint_2023-09-03_4.41.45 PM_EB179B85.traceОткройте trace: open Launch_oxlint_2023-09-03_4.41.45\ PM_EB179B85.trace.
Сверху вниз:
- Панель сверху → CPUs
- Слева сбросьте фильтр (
x) → Time Profiler - Внизу «Call Tree»: включите «Invert Call Tree», отключите разбиение по потокам.
Для памяти и диска: --template 'Allocations' и --template 'File Activity'.
Точнее по CPU (кэш L1/L2, циклы, инструкции, ветвления) — шаблон «CPU Counters»:
- Откройте Instruments → шаблон CPU Counters.
- В настройках включите High Frequency Sampling и добавьте счётчики (Cycles, Instructions,
L1D_CACHE_MISS_LDи т.д.). - Сохраните шаблон через File → Save as Template.
- Используйте имя в
--template, например:xcrun xctrace record --template 'My Custom CPU Counters' --output . --launch -- /path/to/oxc/target/release-with-debug/oxlint
Куча — dhat
dhat помогает искать утечки и смотреть паттерны аллокаций на куче.
Подключение
В Cargo.toml:
[dependencies]
dhat = "0.3"В начале бинарного crate:
#[global_allocator]
static ALLOC: dhat::Alloc = dhat::Alloc;Запись профиля
Профайлер считает аллокации от создания до уничтожения:
fn main() {
let _profiler = dhat::Profiler::new_heap();
// код под наблюдением
}Или только внутри функции:
fn my_function() {
let _profiler = dhat::Profiler::new_heap();
}При drop создаётся dhat-heap.json.
Просмотр
- Откройте https://nnethercote.github.io/dh_view/dh_view.html
- Загрузите
dhat-heap.json - Метрики в «Sort metrics»:
- At t-gmax (bytes) — что занимало память в пике
- At t-end (bytes) — что не освобождено к концу (утечки)
- Total (bytes) — суммарный объём аллокаций за сеанс
Явное управление временем жизни
Чтобы обрезать хвост очистки и смотреть состояние кучи раньше:
struct MyApp {
profiler: Option<dhat::Profiler>,
}
impl MyApp {
fn close(&mut self) {
self.profiler = None;
// очистка
}
}Так проще понять, какие структуры держат память в заданной точке выполнения.