Профілювання часу запуску Vim


139

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

Чи є спосіб профілактики запуску або запуску сценарію Vim? В ідеалі я хотів би знати, скільки часу Vim витрачає на кожен завантажений ним сценарій Vim.

Відповіді:


188

Якщо ви використовуєте Vim 7.2.269 або новішу версію, то є опція --startuptime, яку ви можете використовувати.

vim --startuptime vim.log

з довідки ( vim -h):

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

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


Я не розумів, що vim мав профільну команду, дякую, що вказав на це.
Бендж

@Benj Його можна відключити. Відповідно до doc, вам потрібен або vim з величезним набором функцій, або самостійно складений, де ви явно ввімкнули + профіль, не вмикаючи цей набір.
ZyX

2
Зробив би +3 це, якби міг. Це допомогло мені відстежити заїзд dbext.vim, який займав три секунди github.com/johnsyweb/dotfiles/commit/09c3001
Johnsyweb

@ZyX, Як це можна зробити в оболонці Windows (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 Використовуйте подвійні лапки. Або баш з цигуна.
ZyX

39

Я створив цей проект Github, щоб краще відповісти на ваше запитання. В основному, це підсумовує час для кожного виклику функції для кожного плагіну, що не очевидно (але важливо) з вихідного профілю vim-профілю. Bash, Python, R, Ruby підтримуються для створення результатів профілювання.

Ви отримаєте такий результат:

vim-плагіни-профіль фігура

Поряд із текстовим виведенням:

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

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

1
Фантастичне, яке чудове рішення.
Бендж

3
Чи знаєте ви, що "perl -n" робить час (<>) {} для вас.
Бендж

1
Тепер, коли ви це згадуєте: так, я зробив. Я збираюсь відредагувати відповідь, щоб отримати короткі команди. Дякую.
innaM

20

На основі роботи, виконаної @hyiltiz, що залежить від R, я створив Python-версію профайлера, оскільки це частіше доступне в системі, у якій R.

Це також трохи простіше розширити, таким чином, особливості:

  • Автоматичне виявлення папки плагіна,
  • Сюжет бару завдяки matplotlib,
  • Проведіть аналіз на кількох виконаннях, щоб отримати середнє / стандартне відхилення ,
  • Підтримує і vim, і neovim ,
  • Може використовуватися з повною командою vim для перевірки функцій ледачого завантаження, відкриття файлу з певним файлом тощо,
  • Експорт результату в файл CSV.

Вихід подібний до того, що забезпечує vim-plugins-профіль:

$ 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
=====================================

vim-profiler


Цей плагін не працює для неовім 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

1
Солодке! Я взяв на себе сміливість трохи скоротити це і зробити його більш «перлішним».
innaM

5

Якщо ви завантажуєте ваші плагіни з .vimrc-файлу, ви можете поставити qна деякий рядок частину через файл, щоб змусити його вийти, щоб ви могли використовувати таймер процесу, як команда unix time. Більш ретельно це виглядатиме так:

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

Це не елегантно, але я думаю, що це виконає роботу.


Хм, непогано в дрібниці. У мене вже розбито vimrc на безліч відокремлених файлів, тому не слід занадто важко автоматизувати.
Бендж


1

Це може бути зручно простежити під --startimeчас відкриття певного файлу

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

0

Чи немає timeкоманди bash, яку можна використовувати так:

time vim

EDIT : Не включає час запуску сценаріїв. Використовуйте замість пропозиції @jamessan.


Так, є, але це лише підказало б, скільки часу вам потрібно було відкрити і закрити, а не скільки часу знадобилося для аналізу кожного сценарію.
Бендж
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.