debug profile для debug
Сигнатура
> debug profile {flags} (closure)
Флаги
-
--spans, -s: Собирает диапазоны профилируемых элементов. -
--expand-source, -e: Собирает полные фрагменты исходного кода профилируемых элементов. -
--values, -v: Собирает выходные значения элементов конвейера. -
--lines, -l: Собирает номера строк. -
--duration-values, -d: Отображает длительность выполнения инструкций в виде значений длительности, а не в миллисекундах. -
--max-depth, -m {int}: На сколько уровней блоков/замыканий заходить (по умолчанию — 2).
Параметры
-
closure: Замыкание для профилирования.
Типы входных и выходных данных:
| вход | выход |
|---|---|
| any | table |
Примеры
Профилирование вычисления конфигурации.
> debug profile { source $nu.config-path }Профилирование вычисления конфигурации с большей детализацией.
> debug profile { source $nu.config-path } --max-depth 4Примечания
Профилировщик анализирует каждую вычисленную инструкцию внутри замыкания, заходя во все вызовы команд и другие блоки/замыкания.
Вывод можно значительно настроить. По умолчанию включены следующие столбцы:
- depth : Глубина инструкции. Каждый вход в блок увеличивает глубину на один уровень. Параметр --max-depth задаёт, на сколько уровней блоков заходить.
- id : Идентификатор инструкции
- parent_id : Идентификатор инструкции, создавшей родительскую область видимости
- source : Исходный код, породивший инструкцию. Если исходный код состоит из нескольких строк, используется только первая строка, а в конце добавляется
.... Полный исходный код можно вывести с помощью флага --expand-source. - pc : Индекс инструкции в блоке.
- instruction : Инструкция, выполнение которой отображается в удобочитаемом виде.
- duration : Время выполнения инструкции.
- (необязательно) span : Диапазон, связанный с инструкцией. Его можно просмотреть с помощью команды
view span. Включается флагом --spans. - (необязательно) output : Выходное значение инструкции. Включается флагом --values.
Чтобы показать, как устроены глубина и идентификаторы, рассмотрим debug profile { do { if true { echo 'spam' } } }. При каждом выполнении инструкции генерируется уникальный идентификатор; здесь есть два уровня глубины:
depth id parent_id source pc instruction
0 0 0 debug profile { do { if true { 'spam' } } } 0 <start>
1 1 0 { if true { 'spam' } } 0 load-literal %1, closure(2164)
1 2 0 { if true { 'spam' } } 1 push-positional %1
1 3 0 { do { if true { 'spam' } } } 2 redirect-out caller
1 4 0 { do { if true { 'spam' } } } 3 redirect-err caller
1 5 0 do 4 call decl 7 "do", %0
2 6 5 true 0 load-literal %1, bool(true)
2 7 5 if 1 not %1
2 8 5 if 2 branch-if %1, 5
2 9 5 'spam' 3 load-literal %0, string("spam")
2 10 5 if 4 jump 6
2 11 5 { if true { 'spam' } } 6 return %0
1 12 0 { do { if true { 'spam' } } } 5 return %0
При входе в каждый блок глубина увеличивается на 1, а при выходе из него уменьшается на 1. Так можно управлять детализацией профилирования. Если передать параметр --max-depth=1 в приведённом выше примере, выполнение остановится внутри do на if true { 'spam' }. Идентификатор позволяет различать элементы. Значение parent_id показывает, что инструкции внутри блока выполняются из-за do (5), который, в свою очередь, был порождён корневым debug profile { ... }.
Чтобы лучше понять, как инструкции соотносятся с исходным кодом, см. команду view ir.
Примечание: в некоторых случаях порядок элементов конвейера может показаться неочевидным. Например, [ a bb cc ] | each { $in | str length } включает неявные операции collect и ленивое вычисление, из-за которых иерархия id/parent_id становится запутанной. Для изучения таких случаев полезен флаг --expr.
Copyright © 2019–2026 The Nushell Project DevelopersLicensed under the MIT License.
https://www.nushell.sh/commands/docs/debug_profile.html