Fasd: Devagar

Criado em 10 mar. 2013  ·  11Comentários  ·  Fonte: clvv/fasd

Estive fazendo o perfil do meu Terminal hoje e percebi que fasd é consideravelmente mais lento do que z .

z foi adicionado ao meu .zshrc com: . brew --prefix /etc/profile.d/z.sh

fasd com: eval "$(fasd --init posix-alias zsh-hook zsh-ccomp zsh-ccomp-install zsh-wcomp zsh-wcomp-install)"

Os resultados ao usar zprof com eles exclusivamente habilitados foram:

fasd

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

z

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

Ajuda muito usar apenas a configuração simples: eval "$(fasd --init posix-alias zsh-hook)"

Mas ainda assim lento em comparação com z .

fasd (simples)

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

Uma vez que fasd é executado em cada mudança de pasta, é uma lentidão bastante perceptível.

Comentários muito úteis

Não sei se isso ainda é relevante, mas usar este snippet de código corrige o problema para mim:

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

Todos 11 comentários

Suspeito que a principal razão seja que fasd é chamado duas vezes como um executável em preexec . Esta sobrecarga pode ser minimizada se fasd for originado por zsh ( source =fasd deve funcionar em zsh).

Além disso, para tornar a comparação mais justa, você pode dizer ao fasd ez para usar o mesmo banco de dados, já que o fasd apenas usa o formato de dados do z.

Eu olhei para o código e parece possível condensar duas chamadas executáveis ​​em uma. Vou brincar com o código quando tiver tempo.

Alguma atualização sobre isso? Eu adoraria usar o fasd, mas agora é muito lento.

inlining the --sanitize sed regex na função também ajuda um pouco, mas ainda é muito lento.

estou tendo lentidão também usando simplesmente: eval "$(fasd --init auto)" em .bash_profile.

O perfil

@wamatt está no texto do problema.

Também estou observando que o fasd desacelera minha concha significativamente.
Tenho eval "$(fasd --init auto)" no meu .zshrc .

zsh 5.0.8 (x86_64-apple-darwin14.3.0) no 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

Ainda lento em 2017 :)

A lentidão foi a primeira coisa que notei após instalar o fasd, então fiz alguns perfis também.

Com meu ~/.zshrc padrão

$ time (for i in {1..20}; do zsh -ic 'exit'; done)

================
CPU 87%
user    1.913
system  0.880
total   3.207

Com 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

Com 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

Portanto, z adiciona <1 ms, enquanto fasd adiciona 39,3 ms.

Não sei se isso ainda é relevante, mas usar este snippet de código corrige o problema para mim:

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

daqui
Suspeito que a principal razão seja que fasd é chamado duas vezes como um executável em preexec . Esta sobrecarga pode ser minimizada se fasd for originado por zsh ( source =fasd deve funcionar em zsh).

Esse = na declaração de origem é significativo?

Não sei se isso ainda é relevante, mas usar este snippet de código corrige o problema para mim:

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

Não vejo nenhuma diferença de desempenho se usar a saída de zsh --init zsh-hook que está abaixo.
Não tenho certeza se é relevante, mas eu salvo o seguinte cortado em um arquivo de cache e, em seguida, a fonte em vez de fazer um eval sobre a saída.

# 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
Esta página foi útil?
0 / 5 - 0 avaliações

Questões relacionadas

sypl picture sypl  ·  12Comentários

josephholsten picture josephholsten  ·  15Comentários

rendybjunior picture rendybjunior  ·  14Comentários

simendsjo picture simendsjo  ·  6Comentários

sbglasius picture sbglasius  ·  5Comentários