Fasd: Медленный

Созданный на 10 мар. 2013  ·  11Комментарии  ·  Источник: clvv/fasd

Сегодня я профилировал свой Терминал и заметил, что fasd значительно медленнее, чем z .

z был добавлен в мой .zshrc с помощью: . brew --prefix /etc/profile.d/z.sh

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

Результаты при использовании zprof с их монопольным включением были:

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

Очень помогает простая настройка: eval "$(fasd --init posix-alias zsh-hook)"

Но все равно медленнее по сравнению с z .

fasd (простой)

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 запускается при каждом изменении папки, это довольно заметное замедление.

Самый полезный комментарий

Я не знаю, актуально ли это по-прежнему, но использование этого фрагмента кода решает проблему для меня:

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

Все 11 Комментарий

Я подозреваю, что основная причина в том, что fasd дважды вызывается как исполняемый файл в preexec . Эти накладные расходы можно минимизировать, если fasd получен из zsh ( source =fasd должен работать в zsh).

Кроме того, чтобы сравнение было более справедливым, вы можете указать fasd и z использовать одну и ту же базу данных, поскольку fasd просто использует формат данных z.

Я посмотрел на код, и мне показалось, что можно объединить два исполняемых вызова в один. Я поиграю с кодом, когда у меня будет время.

Есть обновления по этому поводу? Я бы хотел использовать fasd, но сейчас он слишком медленный.

встраивание регулярного выражения --sanitize sed в функцию также несколько помогает, но все равно очень медленно.

У меня тоже есть замедление, используя просто: eval "$(fasd --init auto)" в .bash_profile.

Профилирование @sindresorhus звучит интересно. ум поделиться, как ты это делаешь?

@wamatt Это в тексте выпуска.

Я также заметил, что fasd значительно замедляет мою оболочку.
У меня 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 мс, а fasd добавляет 39,3 мс.

Я не знаю, актуально ли это по-прежнему, но использование этого фрагмента кода решает проблему для меня:

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
Была ли эта страница полезной?
0 / 5 - 0 рейтинги

Смежные вопросы

rosshadden picture rosshadden  ·  6Комментарии

mhlinder picture mhlinder  ·  3Комментарии

pearofducks picture pearofducks  ·  7Комментарии

simendsjo picture simendsjo  ·  6Комментарии

ixil picture ixil  ·  5Комментарии