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

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

Есть ли способ профилировать запуск Vims или script -running? Идеально Id нравится знать, как долго Vim проводит в каждом Vim script он загружается.

Ответ 1

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

vim --startuptime vim.log

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

--startuptime <file> Write startup timing messages to <file>

Ответ 2

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

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

После запуска выше вы найдете файл с именем profile.log в текущем каталоге со всей необходимой информацией. Чтобы получить информационную таблицу per-w370 > , аналогичную уже существующей для каждой функции, используйте (после открытия этого файла в 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, если количество скриптов слишком велико.

Ответ 3

Я создал этот проект Github, чтобы лучше ответить на ваш вопрос. В принципе, он суммирует время для каждого вызова функций для каждого плагина, что не является очевидным (но важным) из вывода исходного файла vim.

Вы получите фигуру результата следующим образом:

vim-plugins-profile figure

Наряду с текстовым выходом следующим образом:

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!    

Ответ 4

Вы можете запустить 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

Ответ 5

Я уточнил vim -V решение с помощью innaM, чтобы показать время дельта:

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

Ответ 6

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

Он также немного легче расширяется, таким образом, функции:

  • Автоматическое обнаружение папки плагина,
  • Строка Bar благодаря matplotlib,
  • Запустите анализ нескольких исполнений, чтобы получить среднее/стандартное отклонение,
  • Поддерживает как vim, так и neovim,
  • Может использоваться с командой full 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 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
=====================================

vim-profiler

Ответ 7

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

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

Это не изящно, но я думаю, что он выполнит свою работу.

Ответ 8

Удобно проследить --startime при открытии определенного файла

gvim app/views/layouts/application.html.erb --startuptime time.log

Ответ 10

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

time vim

EDIT: не включает время запуска скриптов. Вместо этого используйте предложение @jamessan.