Профилирование ЦП
Deno включает встроенную поддержку профилирования ЦП V8, которая помогает выявлять узкие места производительности в коде. Используйте флаг --cpu-prof, чтобы записать профиль ЦП во время выполнения программы:
deno run --cpu-prof your_script.ts
# or with deno eval
deno eval --cpu-prof "for (let i = 0; i < 1e8; i++) {}"
После завершения программы Deno запишет файл .cpuprofile в текущий каталог (например, CPU.1769017882255.25986.cpuprofile). Этот файл можно загрузить в Chrome DevTools (вкладка Performance) или другие средства просмотра профилей V8 для анализа.
Флаги профилирования ЦП
| Флаг | Описание |
|---|---|
--cpu-prof | Включает профилирование ЦП. Профиль записывается на диск при завершении программы. |
--cpu-prof-dir=<DIR> | Каталог, в который будет записан профиль ЦП. По умолчанию используется текущий каталог. Неявно включает --cpu-prof. |
--cpu-prof-name=<NAME> | Имя файла профиля ЦП. По умолчанию — CPU.<timestamp>.<pid>.cpuprofile. |
--cpu-prof-interval=<MICROSECONDS> | Интервал выборки в микросекундах. Значение по умолчанию — 1000 (1 мс). Меньшие значения обеспечивают большую детализацию, но увеличивают размер файлов. |
--cpu-prof-md | Создаёт удобочитаемый отчёт Markdown рядом с файлом .cpuprofile. |
--cpu-prof-flamegraph | Создаёт интерактивную SVG-пламенную диаграмму рядом с файлом .cpuprofile. |
В профилях ЦП указаны номера строк транспилированного кода JavaScript, а не исходного кода TypeScript. Это ограничение профилировщика V8. Для файлов TypeScript указанные номера строк могут напрямую не совпадать с исходным кодом.
Настройка вывода профилей
По умолчанию профили записываются в текущий каталог и получают автоматически сгенерированное имя файла. Вы можете указать, где и как сохранять профили:
# Save profiles to a specific directory
deno run --cpu-prof --cpu-prof-dir=./profiles your_script.ts
# Use a custom filename
deno run --cpu-prof --cpu-prof-name=my-profile.cpuprofile your_script.ts
# Increase sampling frequency for more detail (default: 1000μs)
deno run --cpu-prof --cpu-prof-interval=100 your_script.ts
Меньший интервал --cpu-prof-interval позволяет собирать больше образцов в секунду, обеспечивая более высокую точность за счёт увеличения размера файлов профиля. Значение по умолчанию — 1000 микросекунд (1 мс) — является оптимальным для большинства случаев. Для короткоживущих функций, которые нужно подробно профилировать, попробуйте 100 (0,1 мс).
Анализ профилей в Chrome DevTools
Чтобы проанализировать файл .cpuprofile:
- Откройте Chrome DevTools (F12)
- Перейдите на вкладку Performance
- Нажмите кнопку Load profile (значок стрелки вверх)
- Выберите файл
.cpuprofile
DevTools отобразит пламенную диаграмму и подробную разбивку времени, затраченного в приложении.
Пример: отчёт Markdown
Флаг --cpu-prof-md создаёт сводку в формате Markdown, которую удобно читать без загрузки профиля в DevTools:
deno run -A --cpu-prof --cpu-prof-md server.js
Будут созданы файл .cpuprofile и файл .md со следующим отчётом:
# CPU Profile
| Duration | Samples | Interval | Functions |
| -------- | ------- | -------- | --------- |
| 833.06ms | 641 | 1000us | 10 |
**Top 10:** `op_crypto_get_random_values` 98.5%, `(garbage collector)` 0.7%,
`getRandomValues` 0.6%, `assertBranded` 0.2%
## Hot Functions (Self Time)
| Self% | Self | Total% | Total | Function | Location |
| ----: | -------: | -----: | -------: | ----------------------------- | ----------------- |
| 98.5% | 533.00ms | 98.5% | 533.00ms | `op_crypto_get_random_values` | [native code] |
| 0.7% | 4.00ms | 0.7% | 4.00ms | `(garbage collector)` | [native code] |
| 0.6% | 3.00ms | 0.6% | 3.00ms | `getRandomValues` | 00_crypto.js:5274 |
| 0.2% | 1.00ms | 0.2% | 1.00ms | `assertBranded` | 00_webidl.js:1149 |
## Call Tree (Total Time)
| Total% | Total | Self% | Self | Function | Location |
| -----: | -------: | ----: | -------: | ----------------------------- | ----------------- |
| 16.8% | 91.00ms | 16.8% | 91.00ms | `(anonymous)` | server.js:1 |
| 0.6% | 3.00ms | 0.6% | 3.00ms | `getRandomValues` | 00_crypto.js:5274 |
| 98.5% | 533.00ms | 98.5% | 533.00ms | `op_crypto_get_random_values` | [native code] |
## Function Details
## `op_crypto_get_random_values`
[native code] | Self: 98.5% (533.00ms) | Total: 98.5% (533.00ms) | Samples: 533
Отчёт содержит:
- Сводка: общая длительность, количество образцов, интервал выборки и количество функций
- Топ-10: краткий обзор самых затратных функций
- Горячие функции: функции, отсортированные по собственному времени (времени, проведённому непосредственно в функции, без учёта вызываемых ею функций)
- Дерево вызовов: иерархическое представление стека вызовов и распределения времени
- Сведения о функциях: разбивка по каждой функции с количеством образцов
Пример: интерактивная пламенная диаграмма
Флаг --cpu-prof-flamegraph создаёт автономную интерактивную пламенную диаграмму в формате SVG, которую можно открыть прямо в браузере — дополнительные инструменты не требуются:
deno run --cpu-prof --cpu-prof-flamegraph your_script.ts
Будут созданы файл .cpuprofile и файл .svg. Откройте SVG в любом браузере, чтобы изучить профиль в интерактивном режиме:
- Щёлкните любой фрейм, чтобы увеличить соответствующую ветвь
- Кнопка Reset Zoom восстанавливает полный вид
- Ctrl+F или кнопка Search позволяют искать функции с помощью регулярных выражений, подсветки и отображения процента совпадений
- Флажок Invert переключает отображение на диаграмму-айсберг (корень сверху)
- Наведите указатель на любой фрейм, чтобы увидеть имя функции и количество образцов
Пламенная диаграмма также работает с deno eval:
deno eval --cpu-prof --cpu-prof-flamegraph "for (let i = 0; i < 1e8; i++) {}"
Советы по профилированию
- Профилируйте типичные нагрузки: для HTTP-серверов отправляйте реалистичный трафик до остановки сервера — профиль фиксирует только то, что происходит во время работы программы.
- Используйте собственное и общее время: в отчётах профилирования собственное время — это время, проведённое непосредственно в коде функции, а общее время включает время выполнения вызываемых ею функций. Большое собственное время указывает на настоящее узкое место; большое общее время при малом собственном означает, что функция делегирует работу чему-то затратному.
-
Сравнивайте результаты до и после изменений: сохраняйте профили с описательными значениями
--cpu-prof-name(например,before-optimization.cpuprofile), чтобы после внесения изменений сравнивать профили рядом в DevTools. -
Комбинируйте форматы вывода: можно использовать
--cpu-prof-mdи--cpu-prof-flamegraphвместе, чтобы получить все три результата (.cpuprofile,.mdи.svg) за один запуск:›_deno run --cpu-prof --cpu-prof-md --cpu-prof-flamegraph your_script.ts - Отфильтровывайте шум: в профиле короткоживущих программ может преобладать время запуска (загрузка модулей, JIT-компиляция). Чтобы получить более точные результаты, убедитесь, что нужный код выполняется достаточно долго для сбора значимых образцов.
Последнее обновление:
© 2018–2025 the Deno authors
Licensed under the MIT License.
https://docs.deno.com/runtime/fundamentals/cpu_profiling