Perfil de tiempo de inicio de Vim

139

Tengo muchos complementos habilitados cuando uso Vim, he recopilado complementos a lo largo de los años. Estoy un poco harto de cuánto tiempo tarda Vim en comenzar ahora, así que me gustaría perfilar su inicio y ver cuál de los muchos complementos que tengo son responsables.

¿Hay alguna forma de perfilar el inicio de Vim o la ejecución de scripts? Idealmente, me gustaría saber cuánto tiempo pasa Vim en cada script de Vim que carga.

Benj
fuente

Respuestas:

188

Si está utilizando Vim 7.2.269 o posterior, existe la opción --startuptime que puede usar.

vim --startuptime vim.log

de la ayuda ( vim -h):

--startuptime <file> Write startup timing messages to <file>
jamessan
fuente
44
Y a partir del parche 7.2.286, no se necesita un signo igual. "vim --startuptime vim.log"
jamessan el
25
si quieres que solo lo imprima, pruebavim --startuptime /dev/stdout +qall
Capi Etheriel
@barraponto También existe time vim +qsi solo quieres cronometrar el inicio de vim como un todo.
Braden Best
En mi terminal hay una diferencia significativa entre vim --startuptime /dev/stdout +qally vim --startuptime vim.log +qall; cat vim.log.
Hotschke
40

Puede utilizar el propio mecanismo de creación de perfiles vim:

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

Después de ejecutar lo anterior, encontrará un archivo llamado profile.log en el directorio actual con toda la información requerida. Para obtener una tabla de información por script similar a una por función ya presente, use (después de abrir este archivo en 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])'))

No estará ordenado, pero siempre puede usar el :sortcomando incorporado si el número de scripts es demasiado grande.

ZyX
fuente
No me di cuenta de que vim tenía un comando de creación de perfiles, gracias por señalar esto.
Benj
@Benj Se puede deshabilitar. Según el documento, necesita vim con un gran conjunto de características o uno autocompilado donde habilitó explícitamente + perfil sin habilitar este conjunto.
ZyX
2
Haría +3 esto si pudiera. Me ayudó a rastrear un registro dbext.vim, que tardó
Johnsyweb
@ZyX, ¿cómo puedo hacer esto en el shell de Windows (gvim)? No funciona en Windows gvim. Inserté este comando en el shell de Windows. gvim --cmd 'profile start profile.log' --cmd 'profile func *' --cmd 'profile file *' -c 'profdel func *' -c 'profdel file *' -c 'qa!'Crea muchos archivos vacíos en vim.
Reman
@Remonn Use comillas dobles. O golpe de Cygwin.
ZyX
39

He creado este proyecto Github con el fin de responder mejor a su pregunta. Básicamente, resume el tiempo para cada función que llama para cada plugin, lo que no es obvio (pero importante) a partir de la salida del perfil vim sin procesar. Bash, Python, R, Ruby son compatibles para crear los resultados de creación de perfiles.

Obtendrá una cifra de resultado como esta:

vim-plugins-profile figure

Junto con la salida de texto como esta:

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
fuente
No pude agregar cifras debido a la baja reputación. Puede agregar la figura simplemente agregando un !antes de la etiqueta.
hyiltiz
2
+1 Esto es genial ;-) Mi pregunta tiene 6 años (es difícil de creer), así que espero que hagas esto más para tu beneficio que el mío. Aún así, estoy seguro de que será útil para otros espectadores de la pregunta, que ha sido sorprendentemente popular.
Benj
1
@Benj Sí, estaba tratando de hacer el perfil yo mismo, luego encontré tu pregunta. No estaba satisfecho con las respuestas y solo hice algunas mejoras. Creo que 6 años cambia un poco la tendencia: ¡es muy conveniente obtener gráficos de dulces!
hyiltiz
¡Muy agradable! también revisé mi vim,> 60 ms ^. ^ Esto puede ayudarlo a encontrar rápidamente el paquete que lo ralentiza mucho (que en mi caso todavía no es nada: D)
SidOfc
21

Puede ejecutar vim -V, canalizar la salida a través de una utilidad que agrega marcas de tiempo y analizar la salida. Esta línea de comando hace esto, por ejemplo:

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

Es posible que deba escribir a ciegas :qpara volver a su mensaje. Luego, debe encontrar el archivo vilogen su directorio actual con marcas de tiempo de contrataciones al comienzo de cada línea.

Si puede hacerlo con una granularidad de un segundo, puede hacer esto:

vim -V 2>&1 | perl -ne 'print time, ": ", $_' | tee vilog
innaM
fuente
1
Fantástico, qué gran solución.
Benj
3
¿Sabía que "perl -n" hace el tiempo (<>) {} por usted?
Benj
1
Ahora que lo mencionas: sí, lo hice. Voy a editar la respuesta para obtener comandos más cortos. Gracias.
INNAM
20

Basado en el trabajo realizado por @hyiltiz que depende de R, hice una versión de Python del generador de perfiles, ya que esto está más a menudo disponible en un sistema que R.

También es un poco más fácil de extender, por lo tanto, las características son:

  • Detección automática de la carpeta del complemento,
  • Bar plot gracias a matplotlib,
  • Ejecute el análisis en varias ejecuciones para obtener la desviación promedio / estándar ,
  • Admite vim y neovim ,
  • Se puede usar con un comando vim completo para probar las funciones de carga diferida, abrir un archivo con un tipo de archivo específico, etc.
  • Exportar resultado a un archivo csv.

El resultado es similar a lo que proporciona 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
fuente
Este complemento no funciona para las ventanas neovim. El mensaje de error es No plugin found.
jdhao
16

Refiné la solución vim -V por innaM para mostrar el tiempo delta:

vim -V 2>&1 | perl -MTime::HiRes=time -ne '$a = time unless defined $a; print time - $a, ": ", $_' | tee vilog
Benj
fuente
1
¡Dulce! Me tomé la libertad de acortar esto un poco y hacerlo más "Perlish".
INNAM
5

Si está cargando sus complementos desde un archivo .vimrc, lo que podría hacer es colocar una qlínea en algún punto del archivo para que se cierre y pueda usar un temporizador de proceso, como el timecomando unix . Más a fondo, esto se vería así:

  1. copia de seguridad del .vimrcarchivo existente
  2. comentar todos menos un número selecto de complementos
  3. inserta una qlínea
  4. llamar time vimrepetidamente y promedio
  5. Restaurar copia de seguridad

Esto no es elegante, pero creo que hará el trabajo.

David Berger
fuente
Hmm, no está mal en caso de apuro. Ya tengo mi vimrc dividido en muchos archivos separados, por lo que no debería ser demasiado difícil de automatizar.
Benj
1

Puede ser conveniente rastrear --startimeal abrir un archivo en particular

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

¿No hay un timecomando bash que pueda usarse así:

time vim

EDITAR : no incluye el tiempo de inicio de los scripts. Utilice la sugerencia @jamessan en su lugar.


fuente
Sí, hay pero eso solo le dirá cuánto tiempo le tomó a vim abrir y cerrar, no cuánto tiempo tomó analizar cada script.
Benj