Как я могу профилировать инициализацию оболочки Fi sh? - PullRequest
0 голосов
/ 06 августа 2020

Есть ли способ узнать, сколько времени занимает каждая вещь, когда я запускаю новую оболочку (например, какая-то запущенная функция и c).

Возможно ли это?

Единственное, что я могу придумать, чтобы помочь, - это сделать такие вещи, как:

~
λ time fish -i -c exit

________________________________________________________
Executed in  142.29 millis    fish           external
   usr time   76.19 millis   68.00 micros   76.12 millis
   sys time   61.52 millis  469.00 micros   61.05 millis

А затем попытаться удалить все и снова измерить ... хотя не идеально.

1 Ответ

5 голосов
/ 09 августа 2020

Fi sh имеет встроенную функцию профилирования.

Используйте как

fish --profile /tmp/fish.profile -i -c exit

Это создаст файл с именем "/tmp/fish.profile", выглядящий например,

Time    Sum Command
415 2505    > builtin source /usr/share/fish/config.fish
15  15  -> set -g IFS \n\ \t
6   6   -> set -qg __fish_added_user_paths
4   4   -> set -g __fish_added_user_paths
1   4   -> if not set -q __fish_initialized...
3   3   --> not set -q __fish_initialized
3   3   -> function __fish_default_command_not_found_handler...
4   72  -> if status --is-interactive...

Первый столбец - это время, которое потребовалось для самой команды (в микросекундах, поэтому 1000000 - это 1 с), второй - время, которое она и все ее части (включая вызовы функций и подстановки команд) заняли, третья - это команда плюс индикатор того, насколько глубоко это находится в стеке вызовов.

Чтобы увидеть самые большие временные инвестиции, sort -nk2 /tmp/fish.profile полезно - это сортируется по второму столбцу, поэтому он показывает большие элементы заявки последний (т.е. ближайший к следующему запросу).

Обратите внимание, что это также показывает внутренний запуск fi sh - например, что set -g IFS является внутренним элементом fi sh, но, как правило, быстро, чтобы не было заметно.

...