5

Поскольку я в настоящее время экспериментирую с новым материалом в моем приглашении, мне нужен способ узнать, как это влияет на производительность.

Как я могу следить за тем, сколько времени требуется, чтобы отобразить мое приглашение, и сколько времени требуется для получения. * Rc?

1 ответ1

3

С помощью этой команды вы сможете измерять время запуска, включая получение rc-файлов (+ один вызов печати, который не должен увеличивать накладные расходы):

time zsh -i -c "print -n"
time bash -i -c "echo -n"

С более чем 1000 строк в моем .zshrc это занимает 0,3 секунды на моей установке Cygwin . И нет, это действительно не high-end-машина (iCore2Duo P8700).

Что касается времени рендеринга:

  • в bash это возможно time встроенных команд. Тем не менее, я не знаю возможности визуализации $PS1 в качестве приглашения.

  • в zsh все наоборот, с помощью print -P $PS1 $RPS1 вы можете вывести подсказку командой print. (man zshbuiltins: " [print] -P Выполнить быстрое расширение"). Но кажется, что время не работает со встроенными командами. Вот почему я взломал это:

    cumul=0; for i ({0..99}) {
      start=$(date +%s.%N)
      end=$(date +%s.%N)
      (( cumul+= (end-start) ))
    }
    overhead=$((cumul/100.))
    cumul=0; for i ({0..99}) {
      start=$(date +%s.%N)
      print -P $PS1 $RPS1
      end=$(date +%s.%N)
      (( cumul+= (end-start) ))
    }
    print $((cumul/100. - overhead))
    

    Во-первых, это измеряет накладные расходы, вызванные командами date . Это делается 100 раз для лучшей статистики. Затем включается print -P $PS1 $RPS1 , также выполняется 100 раз, и накладные расходы, определенные в первой части, вычитаются. Последовательные вызовы показывают, что вы не можете доверять цифре 1 мс, но цифра 10 мс кажется надежной. С ожидаемым значением порядка секунд, которого должно быть достаточно.

Но, как @Michael Kjörling уже упоминал в комментарии, приглашение должно быть выполнено в кратчайшие сроки. Так что либо вы должны подумать о том, как оптимизировать вашу подсказку, либо принять во внимание, что, по моему опыту, время рендеринга подсказок (как и в вашем вопросе) - лишь малая часть времени отображения подсказок. (Я говорю здесь в основном о оболочке Z, но я предполагаю, что в bash есть похожие понятия.) Потому что есть другие функции, которые выполняются до отображения подсказки. Вот что сразу приходит мне в голову:

  • precmd: выполняется перед каждым приглашением; используйте which precmd чтобы увидеть, что это такое в вашем случае
  • если у вас включена опция sharedhistory , файл ~/.zsh_history (или как вы его назвали) будет прочитан. Особенно, если ваш домашний каталог находится в удаленной файловой системе, может возникнуть значительная задержка. Я также наблюдаю время от времени за несколько секунд до появления подсказки, когда сервер NFS сильно загружен.

Инструментом для подробного анализа временных требований внешних программ / внутренних функций является модуль zsh/zprof , загруженный

zmodload zsh/zprof

От man zshmodules: «При загрузке zsh/zprof вызывает профилирование функций оболочки. Результаты профилирования могут быть получены с помощью встроенной команды zprof, предоставляемой этим модулем. "

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .