Profilazione Tempo di avvio di Vim


139

Ho molti plugin abilitati quando uso Vim - ho collezionato plugin nel corso degli anni. Sono un po 'stufo di quanto tempo impiega Vim a iniziare ora, quindi mi piacerebbe profilarne l'avvio e vedere quali dei molti plugin di cui sono responsabile.

C'è un modo per profilare l'avvio o l'esecuzione degli script di Vim? Idealmente, vorrei sapere quanto Vim impiega in ogni script Vim che carica.

Risposte:


188

Se stai usando Vim 7.2.269 o successivo, allora puoi usare l'opzione --startuptime.

vim --startuptime vim.log

dall'aiuto ( vim -h):

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

4
E a partire dalla patch 7.2.286, non è necessario alcun segno di uguale. "vim --startuptime vim.log"
jamessan,

25
se vuoi stamparlo, provavim --startuptime /dev/stdout +qall
Capi Etheriel,

@barraponto C'è anche time vim +qse vuoi solo programmare l'avvio di vim nel suo insieme.
Braden Best

Sul mio terminale c'è una differenza significativa tra vim --startuptime /dev/stdout +qalle vim --startuptime vim.log +qall; cat vim.log.
Hotschke,

40

È possibile utilizzare il proprio meccanismo di profilazione di vim:

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

Dopo aver eseguito quanto sopra, troverai un file chiamato profile.log nella directory corrente con tutte le informazioni richieste. Per ottenere una tabella di informazioni per script simile a quella per funzione già presente, utilizzare (dopo aver aperto questo file in 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])'))

Non sarà ordinato, ma puoi sempre usare il :sortcomando integrato se il numero di script è troppo grande.


Non mi ero reso conto che Vim avesse un comando di profilazione, grazie per averlo sottolineato.
Benj,

@Benj Può essere disabilitato. Secondo il documento, è necessario vim con un set enorme di funzionalità o uno compilato automaticamente in cui è stato esplicitamente abilitato + profilo senza abilitare questo set.
ZyX,

2
Lo farei +3 se potessi. Mi ha aiutato a rintracciare un check-in dbext.vim, che
impiegava

@ZyX, Come posso farlo nella shell di Windows (gvim)? Non funziona in Windows gvim. Ho inserito questo comando nella shell di Windows. gvim --cmd 'profile start profile.log' --cmd 'profile func *' --cmd 'profile file *' -c 'profdel func *' -c 'profdel file *' -c 'qa!'Crea molti file vuoti in vim.
Reman,

@Remonn Usa virgolette doppie. O bash da Cygwin.
ZyX,

39

Ho creato questo progetto Github per rispondere meglio alla tua domanda. Fondamentalmente, riassume i tempi per ogni chiamata di funzione per ogni plugin, che non è ovvio (ma importante) dall'output del profilo vim non elaborato. Bash, Python, R, Ruby sono supportati per la creazione dei risultati del profilo.

Otterrai un risultato simile a questo:

figura del profilo di vim-plugins

Insieme all'output di testo in questo modo:

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!    

Non ho potuto aggiungere cifre a causa della scarsa reputazione. Puoi aggiungere la figura semplicemente aggiungendo un !prima del tag.
hyiltiz,

2
+1 Questo è piuttosto interessante ;-) La mia domanda ha 6 anni ormai (difficile da credere), quindi spero che lo stia facendo più per il tuo beneficio che per il mio. Tuttavia, sono sicuro che sarà utile per altri spettatori della domanda, che è stata sorprendentemente popolare.
Benj,

1
@Benj Sì, stavo provando a fare il profilo da solo, poi ho trovato la tua domanda. Non ero soddisfatto delle risposte e ho appena apportato alcuni miglioramenti. Credo che 6 anni cambino un po 'la tendenza - è molto conveniente ottenere grafici di caramelle!
hyiltiz,

Molto bella! controllato anche il mio vim,> 60 ms ^. ^ Questo può aiutarti a trovare rapidamente il pacchetto che ti rallenta molto (che nel mio caso non è ancora nulla: D)
SidOfc

21

È possibile eseguire vim -V, reindirizzare l'output tramite un'utilità che aggiunge timestamp e analizza l'output. Questa riga di comando fa questo, ad esempio:

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

Potrebbe essere necessario digitare alla cieca :qper tornare al prompt. Successivamente, dovresti trovare il file vilognella tua directory corrente con i timestamp dei noleggi all'inizio di ogni riga.

Se puoi fare con una granularità di un secondo, puoi farlo:

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

1
Fantastico, un'ottima soluzione.
Benj,

3
Sapevi che "perl -n" fa il tempo (<>) {} per te.
Benj,

1
Ora che me lo dici: sì, l'ho fatto. Ho intenzione di modificare la risposta per ottenere comandi più brevi. Grazie.
innaM

20

Sulla base del lavoro svolto da @hyiltiz che dipende da R, ho realizzato una versione Python del profiler, poiché questa è più spesso disponibile su un sistema che R.

È anche leggermente più facile da estendere, quindi le caratteristiche sono:

  • Rilevamento automatico della cartella dei plugin,
  • Grafico a barre grazie a matplotlib,
  • Esegui l'analisi su diverse esecuzioni per ottenere la deviazione media / standard ,
  • Supporta sia Vim che Neovim ,
  • Può essere utilizzato con un comando vim completo per testare le funzionalità di caricamento lento, l'apertura di un file con un tipo di file specifico, ecc.,
  • Esporta il risultato in un file CSV.

L'output è simile a quello che fornisce il profilo 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


Questo plugin non funziona per Windows Neovim. Il messaggio di errore è No plugin found.
jdhao,

16

Ho perfezionato la soluzione vim -V di innaM per mostrare il delta time:

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

1
Dolce! Mi sono preso la libertà di accorciare un po 'questo e renderlo più "Perlish".
innaM

5

Se stai caricando i tuoi plugin da un file .vimrc, quello che potresti fare è mettere un qpo 'su una riga a metà del file per farlo uscire in modo da poter usare un timer di processo, come il timecomando unix . Più a fondo, questo sembrerebbe:

  1. eseguire il backup del .vimrcfile esistente
  2. commentare tutti tranne un numero selezionato di plugin
  3. inserire una qlinea
  4. chiamare time vimripetutamente e mediamente
  5. ripristinare il backup

Questo non è elegante ma penso che farà il lavoro.


Hmm, non male in un pizzico. Ho già diviso il mio vimrc in molti file separati, quindi non dovrebbe essere troppo difficile da automatizzare.
Benj,


1

Può essere conveniente rintracciare --startimequando si apre un determinato file

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

0

Non esiste un timecomando bash che può essere usato in questo modo:

time vim

EDIT : non include il tempo di avvio degli script. Usa invece il suggerimento @jamessan.


Sì, c'è ma ciò ti direbbe solo quanto tempo ha impiegato Vim sia per aprire che per chiudere, non quanto tempo ha impiegato per analizzare ogni script.
Benj,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.