Время запуска профилирования Vim

139

У меня включено много плагинов при использовании Vim - я собирал плагины на протяжении многих лет. Я немного сыт по горло тем, сколько времени требуется Vim, чтобы начать сейчас, поэтому я хотел бы профилировать его запуск и посмотреть, какие из многих плагинов у меня есть ответственность.

Есть ли способ профилировать запуск Vim или запуск скриптов? В идеале я хотел бы знать, сколько времени Vim тратит на каждый загружаемый скрипт Vim.

Benj
источник

Ответы:

188

Если вы используете Vim 7.2.269 или новее, тогда вы можете использовать опцию --startuptime.

vim --startuptime vim.log

из справки ( vim -h):

--startuptime <file> Write startup timing messages to <file>
jamessan
источник
4
Начиная с патча 7.2.286, знак равенства не требуется. "vim --startuptime vim.log"
jamessan
25
если вы хотите просто напечатать, попробуйтеvim --startuptime /dev/stdout +qall
Capi Etheriel
@barraponto Есть также, time vim +qесли вы хотите рассчитать время запуска vim в целом.
Брэден Бест
На моем терминале есть существенная разница между vim --startuptime /dev/stdout +qallи vim --startuptime vim.log +qall; cat vim.log.
Хотчке
40

Вы можете использовать собственный механизм профилирования vim:

vim --cmd 'profile start profile.log' \
    --cmd 'profile func *' \
    --cmd 'profile file *' \
    -c 'profdel func *' \
    -c 'profdel file *' \
    -c 'qa!'

После выполнения описанного выше вы найдете файл с именем profile.log в текущем каталоге со всей необходимой информацией. Чтобы получить информационную таблицу для каждого сценария, аналогичную уже существующей для каждой функции, используйте (после открытия этого файла в vim):

" Open profile.log file in vim first
let timings=[]                      
g/^SCRIPT/call add(timings, [getline('.')[len('SCRIPT  '):], matchstr(getline(line('.')+1), '^Sourced \zs\d\+')]+map(getline(line('.')+2, line('.')+3), 'matchstr(v:val, ''\d\+\.\d\+$'')'))
enew                            
call setline('.', ['count total (s)   self (s)  script']+map(copy(timings), 'printf("%5u %9s   %8s  %s", v:val[1], v:val[2], v:val[3], v:val[0])'))

Он будет не отсортирован, но вы всегда можете использовать встроенную :sortкоманду, если количество сценариев слишком велико.

ZYX
источник
Я не знал, что у vim была команда профилирования, спасибо, что указал на это.
Benj
@Benj Это может быть отключено. В соответствии с документом вам понадобится vim с огромным набором функций или самостоятельно скомпилированный, в котором вы явно включили + профиль без включения этого набора.
ZyX
2
+3 это если бы я мог. Это помогло мне отследить регистрацию dbext.vim, которая заняла более трех секунд github.com/johnsyweb/dotfiles/commit/09c3001
Johnsyweb
@ZyX, как я могу это сделать в Windows Shell (Gvim)? Это не работает в Windows Gvim. Я вставил эту команду в оболочку Windows. gvim --cmd 'profile start profile.log' --cmd 'profile func *' --cmd 'profile file *' -c 'profdel func *' -c 'profdel file *' -c 'qa!'Она создает много пустых файлов в vim.
Реман
@Remonn Используйте двойные кавычки. Или Bash от Cygwin.
ZyX
39

Я создал этот проект Github, чтобы лучше ответить на ваш вопрос. По сути, он суммирует время для каждого вызова функции для каждого плагина, что не очевидно (но важно) из необработанного вывода профиля vim. Bash, Python, R, Ruby поддерживаются для создания результатов профилирования.

Вы получите результат, как этот:

Рисунок профиля vim-plugins

Наряду с выводом текста, как это:

Generating vim startup profile...    
Parsing vim startup profile...     
Crunching data and generating profile plot ...    

Your plugins startup profile graph is saved     
as `profile.png` under current directory.    

==========================================    
Top 10 Plugins That Slows Down Vim Startup    
==========================================    
   1    105.13  "vim-colorschemes"    
   2    42.661  "vim-easytags"    
   3    31.173  "vim-vendetta"    
   4    22.02   "syntastic"    
   5    13.362  "vim-online-thesaurus"    
   6    7.888   "vim-easymotion"    
   7    6.931   "vim-airline"    
   8    6.608   "YankRing.vim"    
   9    5.266   "nerdcommenter"    
  10    5.017   "delimitMate"    
==========================================    
Done!    
hyiltiz
источник
Я не мог добавить цифры из-за низкой репутации. Вы можете добавить на рисунке, просто добавив !перед тегом.
Hyiltiz
2
+1 Это довольно круто ;-) Моему вопросу уже 6 лет (в это трудно поверить), поэтому я надеюсь, что вы делали это больше для вашей выгоды, чем для меня. Тем не менее, я уверен, что это будет полезно для других зрителей вопроса, который был удивительно популярен.
Бендж
1
@ Benj Да, я пытался выполнить профилирование самостоятельно, а потом нашел твой вопрос. Я не был удовлетворен ответами и просто сделал некоторые улучшения. Я считаю, что 6 лет немного меняют тренд - очень удобно получать графы конфет!
Hyiltiz
Очень хорошо! проверил мой vim тоже,> 60 мс ^. ^ Это может помочь вам быстро найти пакет, который сильно тормозит (что в моем случае все еще ничего: D)
SidOfc
21

Вы можете запустить vim -V, направить вывод через утилиту, которая добавляет метки времени и проанализировать вывод. Эта командная строка делает это, например:

vim -V 2>&1 | perl -MTime::HiRes=time -ne 'print time, ": ", $_' | tee vilog

Возможно, вам придется слепо напечатать, :qчтобы вернуться к вашей подсказке. После этого вы должны найти файл vilogв вашем текущем каталоге с отметками времени найма в начале каждой строки.

Если вы можете сделать с точностью до секунды, вы можете сделать это:

vim -V 2>&1 | perl -ne 'print time, ": ", $_' | tee vilog
InnaM
источник
1
Фантастика, какое отличное решение.
Benj
3
Знаете ли вы, что "perl -n" делает для вас while (<>) {}.
Benj
1
Теперь, когда вы упомянули это: да, я сделал. Я собираюсь редактировать ответ, чтобы получить более короткие команды. Спасибо.
INNAM
20

Основываясь на работе, проделанной @hyiltiz, которая зависит от R, я сделал версию профилировщика на Python , поскольку она чаще доступна в системе, где R.

Его также немного легче расширить, поэтому есть следующие функции:

  • Автоматическое определение папки плагина,
  • Барный участок благодаря matplotlib,
  • Выполните анализ для нескольких исполнений, чтобы получить среднее / стандартное отклонение ,
  • Поддерживает vim и neovim ,
  • Может использоваться с полной командой vim для тестирования функций отложенной загрузки, открытия файла с определенным типом файла и т. Д.,
  • Экспорт результата в CSV-файл.

Вывод похож на то, что обеспечивает vim-plugins-profile:

$ vim-profiler.py -p nvim

Running nvim to generate startup logs... done.
Loading and processing logs... done.
Plugin directory: /home/user/.config/nvim/plugged
=====================================
Top 10 plugins slowing nvim's startup
=====================================
1         3.326   vim-fugitive
2         2.936   tcomment_vim
3         2.315   vim-hybrid
4         1.751   lightline.vim
5         0.959   vim-sneak
6         0.943   supertab
7         0.542   vim-surround
8         0.536   fzf.vim
9         0.450   fzf
10        0.434   auto-pairs
=====================================

ВИМ-профайлер

BENČ
источник
Этот плагин не работает для неовим windows. Сообщение об ошибке No plugin found.
jdhao
16

Я усовершенствовал ВЬЕТ -V решения по InnaM , чтобы показать время дельты:

vim -V 2>&1 | perl -MTime::HiRes=time -ne '$a = time unless defined $a; print time - $a, ": ", $_' | tee vilog
Benj
источник
1
Сладкий! Я взял на себя смелость немного укоротить это и сделать его более "Perlish".
InnaM
5

Если вы загружаете свои плагины из файла .vimrc, то, что вы могли бы сделать, это поместить в qкакую-то строку часть файла, чтобы заставить его выйти, чтобы вы могли использовать таймер процесса, например, команду unix time. Более подробно это будет выглядеть так:

  1. создать резервную копию существующего .vimrcфайла
  2. закомментируйте все, кроме выбранного количества плагинов
  3. вставить qстроку
  4. звоните time vimрепетийно и средне
  5. восстановление резервной копии

Это не элегантно, но я думаю, что это сделает работу.

Дэвид Бергер
источник
Хм, неплохо в крайнем случае. Я уже разбил свой vimrc на множество отдельных файлов, поэтому его не должно быть слишком сложно автоматизировать.
Benj
1

Это может быть удобно отслеживать --startimeпри открытии определенного файла

gvim app/views/layouts/application.html.erb --startuptime time.log
Mauro
источник
0

Разве нет timeкоманды bash, которую можно использовать так:

time vim

РЕДАКТИРОВАТЬ : Не включает время запуска сценариев. Вместо этого используйте предложение @jamessan.


источник
Да, есть, но это только скажет вам, сколько времени vim занял как открывать, так и закрывать, а не сколько нужно времени для разбора каждого скрипта.
Бендж