如何分析 Fish shell init?

caa*_*os0 2 profiling fish

有没有办法查看当我启动一个新 shell 时每件事花费了多少时间(例如一些正在运行的函数等)。

是否可以?

我唯一能想到的帮助就是做这样的事情:

~
? 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
Run Code Online (Sandbox Code Playgroud)

然后试图取出东西并再次测量......虽然并不理想。

fah*_*aho 10

Fish 具有内置的分析功能。

从fish 3.2开始,它必须--profile只分析您给出的命令并--profile-startup分析启动时间,然后才能--profile将两者一起分析。

使用喜欢

fish --profile-startup /tmp/fish.profile -i -c exit
Run Code Online (Sandbox Code Playgroud)

这将创建一个名为“/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...
Run Code Online (Sandbox Code Playgroud)

第一列是命令本身花费的时间(以微秒为单位,所以 1000000 是 1s),第二列是它和它的所有部分(包括函数调用和命令替换)花费的时间,第三列是命令加上一个指示这是调用堆栈的深处。

查看最大的时间投资sort -nk2 /tmp/fish.profile很有用 - 这按第二列排序,因此它将最后显示大票项目(即最接近下一个提示)。

请注意,这也显示了 fish 的内部启动 -set -g IFS例如,这是一个 fish 内部的东西,但它往往很快,所以它不会突出。