Profilage du temps de démarrage de Vim

139

J'ai beaucoup de plugins activés lorsque j'utilise Vim - j'ai collecté des plugins au fil des ans. J'en ai un peu marre du temps que prend Vim pour démarrer maintenant, alors j'aimerais profiler son démarrage et voir lesquels des nombreux plugins dont je dispose sont responsables.

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

Benj
la source

Réponses:

188

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

vim --startuptime vim.log

de l'aide ( vim -h):

--startuptime <file> Write startup timing messages to <file>
Jamessan
la source
4
Et depuis le patch 7.2.286, aucun signe égal n'est nécessaire. "vim --startuptime vim.log"
jamessan
25
si vous voulez simplement l'imprimer, essayezvim --startuptime /dev/stdout +qall
Capi Etheriel
@barraponto Il y a aussi time vim +qsi vous voulez seulement chronométrer le démarrage de vim dans son ensemble.
Braden Best
Sur mon terminal, il y a une différence significative entre vim --startuptime /dev/stdout +qallet vim --startuptime vim.log +qall; cat vim.log.
Hotschke
40

Vous pouvez utiliser le propre 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 à celle déjà présente par fonction, 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 :sortcommande intégrée si le nombre de scripts est trop grand.

ZyX
la source
Je n'avais pas réalisé que vim avait une commande de profilage, merci de l'avoir signalé.
Benj
@Benj Il peut être désactivé. Selon la documentation, vous avez besoin de vim avec un vaste ensemble de fonctionnalités ou d'un auto-compilé où vous avez explicitement activé + profile sans activer cet ensemble.
ZyX
2
Serait +3 si je pouvais. Cela m'a aidé à retrouver un enregistrement dbext.vim, qui prenait plus de trois secondes github.com/johnsyweb/dotfiles/commit/09c3001
Johnsyweb
@ZyX, comment puis-je faire cela dans le shell Windows (gvim)? Cela ne fonctionne pas dans Windows gvim. J'ai inséré cette commande dans le shell Windows. gvim --cmd 'profile start profile.log' --cmd 'profile func *' --cmd 'profile file *' -c 'profdel func *' -c 'profdel file *' -c 'qa!'Cela crée beaucoup de fichiers vides dans vim.
Reman
@Remonn Utilisez des guillemets doubles. Ou bash de cygwin.
ZyX
39

J'ai créé ce projet Github afin de mieux répondre à votre question. Fondamentalement, cela résume le timing de chaque appel de fonction pour chaque plug-in, ce qui n'est pas évident (mais important) à partir de la sortie du profil vim brut. Bash, Python, R, Ruby sont pris en charge pour la création des résultats de profilage.

Vous obtiendrez un résultat comme celui-ci:

figure de profil vim-plugins

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!    
hyiltiz
la source
Je n'ai pas pu ajouter de chiffres en raison d'une mauvaise réputation. Vous pouvez ajouter dans la figure en ajoutant simplement un !avant l'étiquette.
hyiltiz
2
+1 C'est plutôt cool ;-) Ma question a 6 ans maintenant (difficile à croire) donc j'espère que vous faisiez cela plus à votre avantage que le mien. Pourtant, je suis sûr que cela sera utile pour les autres téléspectateurs de la question, qui a été étonnamment populaire.
Benj du
1
@Benj Oui, j'essayais de faire le profilage moi-même, puis j'ai trouvé votre question. Je n'étais pas satisfait des réponses et j'ai juste fait quelques améliorations. Je crois que 6 ans change un peu la tendance - il est très pratique d'obtenir des graphiques de bonbons!
hyiltiz
Très agréable! vérifié mon vim aussi,> 60 ms ^. ^ Cela peut vous aider à trouver rapidement le paquet qui vous ralentit beaucoup (ce qui dans mon cas n'est toujours rien: D)
SidOfc
21

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

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

Vous devrez peut-être taper aveuglément :qpour revenir à votre invite. Ensuite, vous devriez trouver le fichiervilog dans votre répertoire actuel avec des horodatages d'embauche au début de chaque ligne.

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

vim -V 2>&1 | perl -ne 'print time, ": ", $_' | tee vilog
innaM
la source
1
Fantastique, quelle excellente solution.
Benj
3
Saviez-vous que "perl -n" fait le while (<>) {} pour vous.
Benj
1
Maintenant que vous le mentionnez: oui, je l'ai fait. Je vais modifier la réponse pour obtenir des commandes plus courtes. Merci.
innaM
20

Sur la base du travail effectué par @hyiltiz qui dépend de R, j'ai créé une 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:

  • Détection automatique du dossier du plugin,
  • Bar plot 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 vim complète 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 à celle fournie par 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
la source
Ce plugin ne fonctionne pas pour les fenêtres neovim. Le message d'erreur est No plugin found.
jdhao
16

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

vim -V 2>&1 | perl -MTime::HiRes=time -ne '$a = time unless defined $a; print time - $a, ": ", $_' | tee vilog
Benj
la source
1
Doux! J'ai pris la liberté de raccourcir un peu ceci et de le rendre plus "Perlish".
innaM
5

Si vous chargez vos plugins à partir d'un fichier .vimrc, ce que vous pouvez faire est de mettre une qligne sur une partie du fichier pour le faire quitter afin que vous puissiez utiliser un minuteur de processus, comme la timecommande unix . Plus précisément, cela ressemblerait à:

  1. sauvegarder le .vimrcfichier existant
  2. commenter tous sauf un certain nombre de plugins
  3. insérer une qligne
  4. appeler à plusieurs time vimreprises et en moyenne
  5. restaurer la sauvegarde

Ce n'est pas élégant mais je pense qu'il fera le travail.

David Berger
la source
Hmm, pas mal à la rigueur. J'ai déjà divisé mon vimrc en de nombreux fichiers séparés, donc cela ne devrait pas être trop difficile à automatiser.
Benj
1

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

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

N'y a-t-il pas une timecommande bash 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.


la source
Oui, il y en a, mais cela ne vous dira que combien de temps vim a pris pour ouvrir et fermer, pas combien de temps il a fallu pour analyser chaque script.
Benj