web-dev-qa-db-fra.com

Profilage du temps de démarrage de Vim

J'ai beaucoup de plugins activés lors de l'utilisation de Vim - j'ai collecté des plugins au fil des ans. Je suis un peu fatigué du temps que Vim prend pour démarrer maintenant, donc je voudrais profiler son démarrage et voir lequel des nombreux plugins dont je suis responsable.

Existe-t-il un moyen de profiler le démarrage de Vim ou l'exécution de script? Idéalement, j'aimerais savoir combien de temps Vim passe dans chaque script Vim qu'il charge.

124
Benj

Si vous utilisez Vim 7.2.269 ou une version ultérieure, il existe l'option --startuptime que vous pouvez utiliser.

vim --startuptime vim.log

de l'aide (vim -h):

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

Vous pouvez utiliser le mécanisme de profilage de vim:

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

Après avoir exécuté ce qui précède, vous trouverez un fichier appelé profile.log dans le répertoire actuel avec toutes les informations requises. Pour obtenir une table d'informations par script similaire à une table par fonction déjà présente, utilisez (après avoir ouvert ce fichier dans 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])'))

Il ne sera pas trié, mais vous pouvez toujours utiliser la commande :sort Intégrée si le nombre de scripts est trop important.

37
ZyX

J'ai créé this projet Github afin de mieux répondre à votre question. Fondamentalement, il résume le calendrier de chaque appel de fonction pour chaque plug-in, ce qui n'est pas évident (mais important) à partir de la sortie du profil brut de vim.

Vous obtiendrez un résultat comme celui-ci:

vim-plugins-profile figure

Avec une sortie de texte comme celle-ci:

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!    
35
hyiltiz

Vous pouvez exécuter vim -V, dirigez la sortie via un utilitaire qui ajoute des horodatages et analyse la sortie. Cette ligne de commande fait cela, par exemple:

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

Vous devrez peut-être taper aveuglément :q pour revenir à votre invite. Ensuite, vous devriez trouver le fichier vilog dans votre répertoire courant avec les horodatages d'embauche au début de chaque ligne.

Si vous pouvez le faire avec une granularité d'une seconde, vous pouvez le faire:

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

Sur la base du travail effectué par @ hyiltiz qui dépend de R, j'ai fait un version Python du profileur, car il est plus souvent disponible sur un système que R.

Il est également légèrement plus facile à étendre, les fonctionnalités sont donc les suivantes:

  • Détection automatique du dossier du plugin,
  • Graphique à barres grâce à matplotlib,
  • Exécutez l'analyse sur plusieurs exécutions pour obtenir l'écart moyen/standard ,
  • Prend en charge à la fois vim et neovim ,
  • Peut être utilisé avec une commande complète vim pour tester les fonctionnalités de chargement différé, ouvrir un fichier avec un type de fichier spécifique, etc.,
  • Exportez le résultat dans un fichier csv.

La sortie est similaire à ce que fournit 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

16
BenC

J'ai affiné le vim -V solution par innaM pour montrer le temps delta:

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

Si vous chargez vos plugins à partir d'un fichier .vimrc, ce que vous pourriez faire est de mettre un q sur une ligne à mi-chemin dans le fichier pour le faire quitter afin que vous puissiez utiliser un minuteur de processus, comme l'Unix time, commande. De manière plus approfondie, cela ressemblerait à:

  1. sauvegarde existante .vimrc fichier
  2. commenter tout sauf un certain nombre de plugins
  3. insérer une ligne q
  4. appel time vim à répétition et moyenne
  5. restaurer la sauvegarde

Ce n'est pas élégant mais je pense que cela fera l'affaire.

5
David Berger

Il peut être pratique de tracer le --startime lors de l'ouverture d'un fichier particulier

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

Il existe un plugin pour profiler l'heure de démarrage de vim.

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

1
Amjith

N'y a-t-il pas une commande bash time qui peut être utilisée comme ceci:

time vim

EDIT : N'inclut pas l'heure de démarrage des scripts. Utilisez plutôt la suggestion @jamessan.

0
user650230