Spec-Zone.ru › Nushell

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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API