Profiling Vim Startzeit

139

Ich habe viele Plugins aktiviert, wenn ich Vim verwende - ich habe im Laufe der Jahre Plugins gesammelt. Ich habe es ein bisschen satt, wie lange Vim jetzt braucht, um zu starten, also möchte ich sein Startup-Profil erstellen und sehen, welche der vielen Plugins, die ich habe, dafür verantwortlich sind.

Gibt es eine Möglichkeit, das Starten oder Ausführen von Skripten von Vim zu profilieren? Idealerweise möchte ich wissen, wie lange Vim in jedem geladenen Vim-Skript verbringt.

Benj
quelle

Antworten:

188

Wenn Sie Vim 7.2.269 oder höher verwenden, können Sie die Option --startuptime verwenden.

vim --startuptime vim.log

von der Hilfe ( vim -h):

--startuptime <file> Write startup timing messages to <file>
Jamessan
quelle
4
Ab Patch 7.2.286 ist kein Gleichheitszeichen mehr erforderlich. "vim --startuptime vim.log"
Jamessan
25
Wenn Sie möchten, dass es nur gedruckt wird, versuchen Sie esvim --startuptime /dev/stdout +qall
Capi Etheriel
@barraponto Es gibt auch, time vim +qwenn Sie nur den Start von vim als Ganzes zeitlich festlegen möchten.
Braden Best
Auf meinem Terminal gibt es einen signifikanten Unterschied zwischen vim --startuptime /dev/stdout +qallund vim --startuptime vim.log +qall; cat vim.log.
Hotschke
40

Sie können den eigenen Profilierungsmechanismus von vim verwenden:

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

Nachdem Sie die oben genannten Schritte ausgeführt haben, finden Sie im aktuellen Verzeichnis eine Datei mit dem Namen profile.log mit allen erforderlichen Informationen. Verwenden Sie (nach dem Öffnen dieser Datei in vim) Folgendes, um eine Informationstabelle pro Skript zu erhalten, die der bereits vorhandenen Tabelle pro Funktion ähnelt.

" 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])'))

Es wird unsortiert, aber Sie können immer den integrierten :sortBefehl verwenden, wenn die Anzahl der Skripte zu groß ist.

ZyX
quelle
Ich wusste nicht, dass vim einen Profilierungsbefehl hat, danke, dass Sie darauf hingewiesen haben.
Benj
@ Benj Es kann deaktiviert werden. Laut Dokument benötigen Sie entweder vim mit einer Vielzahl von Funktionen oder eine selbst kompilierte, bei der Sie + profile explizit aktiviert haben, ohne diese Gruppe zu aktivieren.
ZyX
2
Würde dies +3, wenn ich könnte. Es half mir in einen Scheck aufzuspüren dbext.vim, die länger als drei Sekunden nahm github.com/johnsyweb/dotfiles/commit/09c3001
Johnsyweb
@ZyX, wie kann ich das in der Windows-Shell (gvim) machen? Es funktioniert nicht in Windows GVIM. Ich habe diesen Befehl in die Windows-Shell eingefügt. gvim --cmd 'profile start profile.log' --cmd 'profile func *' --cmd 'profile file *' -c 'profdel func *' -c 'profdel file *' -c 'qa!'Er erstellt viele leere Dateien in vim.
Reman
@Remonn Verwenden Sie doppelte Anführungszeichen. Oder von Cygwin schlagen.
ZyX
39

Ich habe dieses Github-Projekt erstellt, um Ihre Frage besser beantworten zu können. Grundsätzlich wird das Timing für jeden Funktionsaufruf für jedes Plugin zusammengefasst, was aus der Ausgabe des Raw-Vim-Profils nicht ersichtlich (aber wichtig) ist. Bash, Python, R, Ruby werden zum Erstellen der Profilerstellungsergebnisse unterstützt.

Sie erhalten eine Ergebniszahl wie folgt:

vim-plugins-profile figur

Zusammen mit der Textausgabe wie folgt:

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
quelle
Aufgrund des geringen Ansehens konnte ich keine Zahlen hinzufügen. Sie können die Abbildung hinzufügen, indem Sie einfach ein !vor dem Tag hinzufügen .
Hyiltiz
2
+1 Das ist ziemlich cool ;-) Meine Frage ist jetzt 6 Jahre alt (kaum zu glauben), also hoffe ich, dass Sie dies mehr zu Ihrem Vorteil als zu meinem getan haben. Trotzdem bin ich sicher, dass es für andere Zuschauer der Frage nützlich sein wird, die überraschend beliebt war.
Benj
1
@Benj Ja, ich habe versucht, das Profiling selbst durchzuführen, und dann Ihre Frage gefunden. Ich war mit den Antworten nicht zufrieden und habe nur einige Verbesserungen vorgenommen. Ich glaube, 6 Jahre ändern den Trend ein wenig - es ist sehr praktisch, Bonbondiagramme zu erhalten!
Hyiltiz
Sehr schön! überprüfte auch mein vim,> 60 ms ^. ^ Dies kann Ihnen helfen, schnell das Paket zu finden, das Sie viel verlangsamt (was in meinem Fall immer noch nichts ist: D)
SidOfc
21

Sie können vim -Vdie Ausgabe ausführen , durch ein Dienstprogramm leiten , das Zeitstempel hinzufügt, und die Ausgabe analysieren. Diese Befehlszeile führt dies aus, z.

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

Möglicherweise müssen Sie blind tippen :q , um zu Ihrer Eingabeaufforderung zurückzukehren. Danach sollten Sie die Datei findenvilog in Ihrem aktuellen Verzeichnis mit den Zeitstempeln für die Einstellung am Anfang jeder Zeile finden.

Wenn Sie mit einer Granularität von einer Sekunde arbeiten können, können Sie dies tun:

vim -V 2>&1 | perl -ne 'print time, ": ", $_' | tee vilog
innaM
quelle
1
Fantastisch, was für eine großartige Lösung.
Benj
3
Wussten Sie, dass "perl -n" die while (<>) {} für Sie erledigt?
Benj
1
Nun, da Sie es erwähnen: Ja, ich habe es getan. Ich werde die Antwort bearbeiten, um kürzere Befehle zu erhalten. Vielen Dank.
InnaM
20

Basierend auf der Arbeit von @hyiltiz , die von R abhängt, habe ich eine Python-Version des Profilers erstellt, da diese auf einem System, das R ist, häufiger verfügbar ist.

Es ist auch etwas einfacher zu erweitern, daher sind die Funktionen:

  • Automatische Erkennung des Plugin-Ordners,
  • Bar Grundstück dank matplotlib,
  • Führen Sie die Analyse über mehrere Ausführungen aus, um den Durchschnitt / die Standardabweichung zu erhalten .
  • Unterstützt sowohl vim als auch neovim ,
  • Kann mit einem vollständigen vim-Befehl verwendet werden , um Funktionen zum verzögerten Laden zu testen, eine Datei mit einem bestimmten Dateityp zu öffnen usw.
  • Exportieren Sie das Ergebnis in eine CSV-Datei.

Die Ausgabe ähnelt der von 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
quelle
Dieses Plugin funktioniert nicht für Neovim Windows. Die Fehlermeldung lautet No plugin found.
JDHAO
16

Ich habe die vim-V- Lösung von innaM verfeinert, um die Deltazeit anzuzeigen:

vim -V 2>&1 | perl -MTime::HiRes=time -ne '$a = time unless defined $a; print time - $a, ": ", $_' | tee vilog
Benj
quelle
1
Süss! Ich habe mir erlaubt, dies ein wenig zu verkürzen und es "perlischer" zu machen.
InnaM
5

Wenn Sie Ihre Plugins aus einer .vimrc-Datei laden, können Sie einen qTeil der Datei in eine Zeile einfügen, um sie zu beenden, damit Sie einen Prozess-Timer wie den Unix- timeBefehl verwenden können. Genauer gesagt würde dies so aussehen:

  1. vorhandene .vimrcDatei sichern
  2. Kommentieren Sie alle bis auf eine ausgewählte Anzahl von Plugins aus
  3. füge eine qZeile ein
  4. Anruf time vimwiederholt und durchschnittlich
  5. Backup wiederherstellen

Das ist nicht elegant, aber ich denke, es wird die Arbeit erledigen.

David Berger
quelle
Hmm, zur Not nicht schlecht. Ich habe mein vimrc bereits in viele separate Dateien aufgeteilt, daher sollte es nicht zu schwierig sein, es zu automatisieren.
Benj
1

Es kann praktisch sein, das --startimebeim Öffnen einer bestimmten Datei zu verfolgen

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

Gibt es nicht einen Bash- timeBefehl, der so verwendet werden kann:

time vim

BEARBEITEN : Enthält nicht die Startzeit der Skripte. Verwenden Sie stattdessen den Vorschlag von @jamessan.


quelle
Ja, aber das würde Ihnen nur sagen, wie lange es gedauert hat, bis vim geöffnet und geschlossen wurde, und nicht, wie lange es gedauert hat, jedes Skript zu analysieren.
Benj