Profilowanie czasu uruchamiania Vima

139

Mam włączonych wiele wtyczek podczas korzystania z Vima - przez lata zbierałem wtyczki. Mam już dość tego, ile czasu zajmuje Vimowi rozpoczęcie teraz, więc chciałbym sprofilować jego uruchomienie i zobaczyć, które z wielu posiadanych przeze mnie wtyczek są za to odpowiedzialne.

Czy istnieje sposób na profilowanie uruchamiania Vima lub uruchamiania skryptów? Idealnie chciałbym wiedzieć, ile czasu Vim spędza na każdym załadowanym skrypcie Vima.

Benj
źródło

Odpowiedzi:

188

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>
jamessan
źródło
4
Od patcha 7.2.286 nie jest potrzebny znak równości. "vim --startuptime vim.log"
jamessan
25
jeśli chcesz, żeby to po prostu wydrukowało, spróbujvim --startuptime /dev/stdout +qall
Capi Etheriel
@barraponto Jest również, time vim +qjeśli chcesz tylko zmierzyć czas uruchamiania vima jako całości.
Braden Best
Na moim terminalu występuje znacząca różnica między vim --startuptime /dev/stdout +qalli vim --startuptime vim.log +qall; cat vim.log.
Hotschke
40

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 w bieżącym katalogu znajdziesz plik o nazwie profile.log zawierający wszystkie wymagane informacje. Aby uzyskać tabelę informacji dla skryptu podobną do już istniejącej dla 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 nieposortowany, ale zawsze możesz użyć wbudowanego :sortpolecenia, jeśli liczba skryptów jest zbyt duża.

ZyX
źródło
Nie zdawałem sobie sprawy, że vim ma polecenie profilowania, dzięki za wskazanie tego.
Benj,
@Benj Można go wyłączyć. Zgodnie z dokumentem, albo potrzebujesz vima z ogromnym zestawem funkcji, albo samodzielnie skompilowanego, w którym jawnie włączyłeś + profile bez włączania tego zestawu.
ZyX
2
Zrobiłbym +3 to, gdybym mógł. Pomogło mi to wyśledzić zameldowanie dbext.vim, które trwało
Johnsyweb
@ZyX, jak mogę to zrobić w powłoce systemu Windows (gvim)? Nie działa w systemie Windows Gvim. Wstawiłem to polecenie do powłoki systemu Windows. gvim --cmd 'profile start profile.log' --cmd 'profile func *' --cmd 'profile file *' -c 'profdel func *' -c 'profdel file *' -c 'qa!'Tworzy wiele pustych plików w vimie.
Reman
@Remonn Użyj podwójnych cudzysłowów. Albo bash z Cygwin.
ZyX
39

Stworzyłem ten projekt Github, aby lepiej odpowiedzieć na twoje pytanie. Zasadniczo podsumowuje czas dla każdego wywołania funkcji dla każdej wtyczki, co nie jest oczywiste (ale ważne) z surowego wyjścia profilu vim. Bash, Python, R, Ruby są obsługiwane do tworzenia wyników profilowania.

Otrzymasz następującą liczbę wyników:

rysunek vim-plugins-profile

Wraz z wyjściem tekstowym takim jak ten:

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
źródło
Nie mogłem dodać liczb z powodu niskiej reputacji. Możesz dodać rysunek, po prostu dodając !przed tagiem.
hyiltiz
2
+1 To jest całkiem fajne ;-) Moje pytanie ma teraz 6 lat (trudno w to uwierzyć), więc mam nadzieję, że robiłeś to bardziej dla siebie niż dla mnie. Mimo to jestem pewien, że przyda się innym widzom pytania, które było zaskakująco popularne.
Benj
1
@Benj Tak, próbowałem samodzielnie wykonać profilowanie, a potem znalazłem twoje pytanie. Nie byłem zadowolony z odpowiedzi i po prostu wprowadziłem kilka ulepszeń. Uważam, że 6 lat nieco zmienia trend - bardzo wygodne jest uzyskanie wykresów cukierków!
hyiltiz
Bardzo dobrze! sprawdziłem też mój vim,> 60 ms ^. ^ To może pomóc ci szybko znaleźć pakiet, który bardzo Cię spowalnia (co w moim przypadku nadal nic nie znaczy: D)
SidOfc
21

Możesz uruchomić vim -V, przepuścić dane wyjściowe przez narzędzie, które dodaje znaczniki czasu i przeanalizować dane wyjściowe. Ta linia poleceń robi to, na przykład:

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

Być może będziesz musiał pisać na ślepo, :qaby wrócić do monitu. Następnie powinieneś znaleźć plik vilogw bieżącym katalogu z sygnaturami czasowymi pracowników na początku każdej linii.

Jeśli możesz zrobić z dokładnością do sekundy, możesz to zrobić:

vim -V 2>&1 | perl -ne 'print time, ": ", $_' | tee vilog
innaM
źródło
1
Fantastycznie, co za świetne rozwiązanie.
Benj
3
Czy wiesz, że "perl -n" robi za Ciebie while (<>) {}.
Benj
1
Skoro o tym wspomniałeś: tak, zrobiłem. Zamierzam edytować odpowiedź, aby uzyskać krótsze polecenia. Dzięki.
innaM
20

Opierając się na pracy wykonanej przez @hyiltiz, która zależy od R, stworzyłem wersję profilera w Pythonie , ponieważ jest ona częściej dostępna w systemie niż R.

Jest również nieco łatwiejszy do rozszerzenia, dlatego funkcje są następujące:

  • Automatyczne wykrywanie folderu wtyczek,
  • Działka barowa dzięki matplotlib,
  • Przeprowadź analizę w kilku wykonaniach, aby uzyskać średnią / odchylenie standardowe ,
  • Obsługuje zarówno vim, jak i neovim ,
  • Może być używany z pełnym poleceniem vim do testowania funkcji leniwego ładowania, otwierania pliku o określonym typie itp.,
  • Eksportuj wynik do pliku CSV.

Wynik jest podobny 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

BenC
źródło
Ta wtyczka nie działa z oknami neovim. Komunikat o błędzie to No plugin found.
jdhao
16

I rafinowany OIR -V rozwiązanie według innaM pokazanie czasu delta

vim -V 2>&1 | perl -MTime::HiRes=time -ne '$a = time unless defined $a; print time - $a, ": ", $_' | tee vilog
Benj
źródło
1
Słodkie! Pozwoliłem sobie trochę skrócić i nadać mu bardziej „Perlish”.
innaM
5

Jeśli ładujesz swoje wtyczki z pliku .vimrc, to co możesz zrobić, to umieścić qw jakimś wierszu w części pliku, aby go zamknąć, aby móc użyć licznika czasu procesu, takiego jak timepolecenie unix . Dokładniej, wyglądałoby to następująco:

  1. wykonaj kopię zapasową istniejącego .vimrcpliku
  2. skomentuj wszystkie oprócz wybranej liczby wtyczek
  3. wstaw qlinię
  4. dzwonić time vimwielokrotnie i średnio
  5. przywracania kopii zapasowej

To nie jest eleganckie, ale myślę, że spełni swoje zadanie.

David Berger
źródło
Hmm, nieźle w mgnieniu oka. Mój plik vimrc został już podzielony na wiele oddzielnych plików, więc nie powinno być zbyt trudno go zautomatyzować.
Benj
1

Wygodne może być śledzenie --startimepliku podczas otwierania określonego pliku

gvim app/views/layouts/application.html.erb --startuptime time.log
Mauro
źródło
0

Czy nie ma timepolecenia bash, którego można użyć w następujący sposób:

time vim

EDYCJA : Nie obejmuje czasu uruchamiania skryptów. Zamiast tego użyj sugestii @jamessan.


źródło
Tak, jest, ale to tylko powie ci, ile czasu zajęło vimowi otwieranie i zamykanie, a nie jak długo trwało analizowanie każdego skryptu.
Benj