今天一直在分析我的终端并注意到fasd
比z
慢得多。
z 被添加到我的 .zshrc 中: .
brew --prefix /etc/profile.d/z.sh
时尚与: eval "$(fasd --init posix-alias zsh-hook zsh-ccomp zsh-ccomp-install zsh-wcomp zsh-wcomp-install)"
使用zprof
并专门启用它们时的结果是:
num calls time self name
-----------------------------------------------------------------------------------
1) 3 1527.75 509.25 83.55% 1527.75 509.25 83.55% _fasd_preexec
2) 2 107.40 53.70 5.87% 107.40 53.70 5.87% compaudit
3) 3 47.98 15.99 2.62% 47.98 15.99 2.62% precmd
4) 1 153.86 153.86 8.41% 46.46 46.46 2.54% compinit
5) 6 39.73 6.62 2.17% 39.73 6.62 2.17% _setup
6) 3 27.72 9.24 1.52% 27.72 9.24 1.52% preexec
num calls time self name
-----------------------------------------------------------------------------------
1) 2 44.18 22.09 48.69% 44.18 22.09 48.69% compaudit
2) 1 67.12 67.12 73.98% 22.95 22.95 25.29% compinit
3) 1 15.62 15.62 17.22% 15.62 15.62 17.22% precmd
4) 1 7.73 7.73 8.52% 7.73 7.73 8.52% preexec
5) 1 0.14 0.14 0.15% 0.14 0.14 0.15% _z
6) 1 0.26 0.26 0.29% 0.12 0.12 0.13% _z_precmd
使用简单的设置有很大帮助: eval "$(fasd --init posix-alias zsh-hook)"
但与z
相比仍然很慢。
num calls time self name
-----------------------------------------------------------------------------------
1) 3 316.83 105.61 47.56% 316.83 105.61 47.56% _fasd_preexec
2) 2 146.31 73.15 21.96% 146.31 73.15 21.96% compaudit
3) 1 228.45 228.45 34.29% 82.14 82.14 12.33% compinit
4) 3 36.87 12.29 5.53% 36.87 12.29 5.53% precmd
5) 3 35.78 11.93 5.37% 35.78 11.93 5.37% _setup
6) 3 24.23 8.08 3.64% 24.23 8.08 3.64% preexec
由于 fasd 在每次文件夹更改时都运行,因此速度下降相当明显。
我怀疑主要原因是fasd
作为preexec
的可执行文件被调用两次。 如果fasd
来自 zsh( source =fasd
应该在 zsh 中工作),则可以最小化此开销。
此外,为了使比较更加公平,您可以告诉 fasd 和 z 使用相同的数据库,因为 fasd 只使用 z 的数据格式。
我查看了代码,似乎可以将两个可执行调用压缩为一个。 当我有时间时,我会玩弄代码。
有任何更新吗? 我很想使用 fasd,但现在它太慢了。
将 --sanitize sed 正则表达式内联到函数中也有一定帮助,但它仍然很慢。
我也有减速使用简单: eval "$(fasd --init auto)"
in .bash_profile。
@sindresorhus分析听起来很有趣。 介意分享你是如何做到的?
@wamatt它在问题文本中。
我还观察到 fasd 显着减慢了我的外壳。
我的.zshrc
有eval "$(fasd --init auto)"
.zshrc
。
zsh 5.0.8 (x86_64-apple-darwin14.3.0)
在 OSX 上。
$ zprof
num calls time self name
-----------------------------------------------------------------------------------
1) 6 194,36 32,39 92,69% 194,36 32,39 92,69% _fasd_preexec
2) 6 5,96 0,99 2,84% 5,96 0,99 2,84% _powerline_get_main_keymap_name
3) 6 5,29 0,88 2,52% 5,29 0,88 2,52% _powerline_set_true_keymap_name
4) 24 2,40 0,10 1,15% 2,40 0,10 1,15% url-quote-magic
5) 6 11,82 1,97 5,64% 0,57 0,09 0,27% _powerline_set_main_keymap_name
6) 6 0,30 0,05 0,14% 0,30 0,05 0,14% zle-line-finish
7) 6 0,27 0,05 0,13% 0,27 0,05 0,13% zle-line-init
8) 6 0,19 0,03 0,09% 0,19 0,03 0,09% omz_termsupport_precmd
9) 6 0,18 0,03 0,09% 0,18 0,03 0,09% omz_termsupport_preexec
10) 6 0,09 0,02 0,04% 0,09 0,02 0,04% _powerline_set_jobnum
11) 6 0,06 0,01 0,03% 0,06 0,01 0,03% omz_termsupport_cwd
-----------------------------------------------------------------------------------
1) 6 194,36 32,39 92,69% 194,36 32,39 92,69% _fasd_preexec
2017 年仍然缓慢 :)
安装 fasd 后我注意到的第一件事就是速度变慢,所以我也做了一些分析。
使用我的默认~/.zshrc
$ time (for i in {1..20}; do zsh -ic 'exit'; done)
================
CPU 87%
user 1.913
system 0.880
total 3.207
与 z: source /usr/share/z/z.sh
$ time (for i in {1..20}; do zsh -ic 'exit'; done)
================
CPU 87%
user 1.837
system 0.970
total 3.213
使用 fasd: eval "$(fasd --init posix-alias zsh-hook zsh-ccomp zsh-ccomp-install zsh-wcomp zsh-wcomp-install)"
$ time (for i in {1..20}; do zsh -ic 'exit'; done)
================
CPU 83%
user 2.207
system 1.123
total 3.993
所以 z 增加 < 1 ms,而 fasd 增加 39.3 ms。
我不知道这是否仍然相关,但使用这段代码为我解决了这个问题:
eval "$(fasd --init posix-alias)" # Anything you want enabled BUT zsh-hook
_fasd_preexec() {
{ eval "fasd --proc \$(fasd --sanitize \$2)"; } &|
}
autoload -Uz add-zsh-hook
add-zsh-hook preexec _fasd_preexec
从这里
我怀疑主要原因是fasd
作为preexec
的可执行文件被调用两次。 如果fasd
来自 zsh(source =fasd
应该在 zsh 中工作),则可以最小化此开销。
源语句中的=
有意义吗?
我不知道这是否仍然相关,但使用这段代码为我解决了这个问题:
eval "$(fasd --init posix-alias)" # Anything you want enabled BUT zsh-hook _fasd_preexec() { { eval "fasd --proc \$(fasd --sanitize \$2)"; } &| } autoload -Uz add-zsh-hook add-zsh-hook preexec _fasd_preexec
如果我使用下面的zsh --init zsh-hook
输出,我看不到任何性能差异。
不确定它是否相关,但我将下面的片段保存在缓存文件中,然后将其作为源文件,而不是对输出执行eval
。
# add zsh hook
_fasd_preexec() {
{ eval "fasd --proc $(fasd --sanitize $1)"; } >> "/dev/null" 2>&1
}
autoload -Uz add-zsh-hook
add-zsh-hook preexec _fasd_preexec
最有用的评论
我不知道这是否仍然相关,但使用这段代码为我解决了这个问题: