Profilowanie czasu uruchamiania Vima

Mam wiele pluginów włączonych podczas korzystania z Vima – zbierałem pluginy przez lata. Jestem trochę zmęczony tym, jak długo vim zajmuje uruchomienie, więc chciałbym profilować jego uruchomienie i zobaczyć, które z wielu wtyczek, które mam, są odpowiedzialne.

Czy Jest jakiś sposób, aby profilować uruchamianie Vima lub uruchamianie skryptu? Idealnie chciałbym wiedzieć, jak długo vim spędza w każdym skrypcie vim ładuje.

Author: Rory O'Kane, 2009-11-06

10 answers

Jeśli używasz Vima 7.2.269 lub nowszego, możesz użyć opcji -- startuptime.

vim --startuptime vim.log

Z pomocy (vim -h):

--startuptime <file> Write startup timing messages to <file>
 196
Author: jamessan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-12-01 16:03:56

Stworzyłem Ten Projekt Github, aby lepiej odpowiedzieć na twoje pytanie. Zasadniczo wywołuje wbudowany profiler vim z odpowiednimi flagami i opcjami, a następnie podsumowuje czas dla każdego wywołania funkcji dla każdej wtyczki, co nie jest oczywiste (ale ważne) z surowego wyjścia vim --profile. Bash, Python, R, Ruby i Perl są obsługiwane (nie musisz niczego instalować, ponieważ najprawdopodobniej masz już jeden z nich) do tworzenia wyników profilowania.

Otrzymasz wynik rysunek taki:

vim-wtyczki-rysunek profilu

Wraz z wyjściem tekstowym w ten sposób:

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!    
 42
Author: hyiltiz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-11-15 17:01:57

Możesz użyć własnego mechanizmu profilowania Vima:

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

Po uruchomieniu powyższego znajdziesz plik o nazwie profile.Zaloguj się do bieżącego katalogu ze wszystkimi wymaganymi informacjami. Aby uzyskać tabelę informacji o skrypcie podobną do obecnej dla jednej funkcji, Użyj (po otwarciu tego pliku w Vimie):

" 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])'))

Będzie niesortowane, ale zawsze możesz użyć wbudowanego polecenia :sort, jeśli liczba skryptów jest zbyt duża.

 41
Author: ZyX,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-09-25 09:10:25

Możesz uruchomić vim -V, przepuścić wyjście przez narzędzie, które dodaje znaczniki czasu i przeanalizować wyjście. Robi to w wierszach poleceń, np.:

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

Być może będziesz musiał ślepo wpisać : q, aby wrócić do monitu. Następnie powinieneś znaleźć plik vilog w bieżącym katalogu ze znacznikami czasu hires na początku każdej linii.

Jeśli możesz zrobić z ziarnistością sekundy, możesz to zrobić:

vim -V 2>&1 | perl -ne 'print time, ": ", $_' | tee vilog
 21
Author: innaM,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-11-06 16:18:09

Bazując na pracy wykonanej przez @ hyiltiz , która zależy od R, zrobiłem wersję Pythona profilera, ponieważ jest ona częściej dostępna na systemie, który R.

Jest również nieco łatwiejsze do rozszerzenia, dlatego funkcje są:

  • Automatyczne wykrywanie folderu wtyczki,
  • wykres słupkowy Dzięki matplotlib,
  • przeprowadź analizę w kilku egzekucjach, aby uzyskać średnie/odchylenie standardowe ,
  • obsługuje zarówno vim i neovim ,
  • może być używany z full vim command do testowania funkcji leniwego ładowania, otwierania pliku z określonym typem pliku itp.,
  • Wyeksportuj wynik do pliku csv.

Wyjście jest podobne do tego, co zapewnia 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
=====================================

vim-profiler

 20
Author: BenC,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:47:14

Udoskonaliłem rozwiązanie vim-V przez innaM, aby pokazać czas delta:

vim -V 2>&1 | perl -MTime::HiRes=time -ne '$a = time unless defined $a; print time - $a, ": ", $_' | tee vilog
 16
Author: Benj,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:47:14

Jeśli ładujesz wtyczki zplik vimrc, co można zrobić, to umieścić q na jakiejś części linii w drodze do pliku, aby go zamknąć, więc można użyć timera procesu, jak polecenie unix time. Dokładniej, wyglądałoby to tak:

  1. kopia zapasowa istniejącego pliku .vimrc
  2. skomentuj wszystkie oprócz wybranej liczby wtyczek
  3. insert a q line
  4. call time vim repeteadly and average
  5. Przywróć kopię zapasową

To nie jest eleganckie, ale myślę, że to wykonam zadanie.

 5
Author: David Berger,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-11-06 14:17:31

Istnieje wtyczka do profilowania czasu uruchamiania Vima.

Http://www.vim.org/scripts/script.php?script_id=2915

 1
Author: Amjith,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-02-07 16:37:58

Może być wygodne śledzenie --startime podczas otwierania określonego pliku

gvim app/views/layouts/application.html.erb --startuptime time.log
 1
Author: Mauro,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-06-11 15:26:24

Czy nie ma komendy bash time, która może być tak użyta:

time vim

EDIT: nie zawiera czasu uruchamiania skryptów. Użyj zamiast tego sugestii @ jamessan.

 0
Author: ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-05-09 01:46:47