Profil Vim başlangıç ​​zamanı


139

Vim kullanırken birçok eklentiyi etkinleştirdim - yıllar boyunca eklentiler topladım. Vim'in başlaması için ne kadar sürdüğünden biraz bıktım, bu yüzden başlangıcını profil haline getirmek ve birçok eklentiden hangisinin sorumlu olduğunu görmek istiyorum.

Vim'in başlangıcını veya komut dosyasını çalıştıran profili belirlemenin bir yolu var mı? İdeal olarak, Vim'in yüklediği her Vim betiğinde ne kadar zaman harcadığını bilmek istiyorum.

Yanıtlar:


188

Vim 7.2.269 veya daha yenisini kullanıyorsanız, kullanabileceğiniz --startuptime seçeneği vardır.

vim --startuptime vim.log

yardımdan ( vim -h):

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

4
7.2.286 yaması itibariyle eşit bir işarete gerek yoktur. "vim --startuptime vim.log"
jamessan

25
sadece yazdırmak istiyorsanız, deneyinvim --startuptime /dev/stdout +qall
Capi Etheriel

@barraponto Ayrıca vim'in time vim +qbaşlangıcını bir bütün olarak zamanlamak istiyorsanız da var.
Braden Best

Terminalimde vim --startuptime /dev/stdout +qallve arasında önemli bir fark var vim --startuptime vim.log +qall; cat vim.log.
Hotschke

40

Vim kendi profil oluşturma mekanizmasını kullanabilirsiniz:

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

Yukarıdakileri çalıştırdıktan sonra, geçerli dizinde gerekli tüm bilgileri içeren profile.log adlı bir dosya bulacaksınız. Zaten mevcut olan her işlev içinkine benzer komut dosyası başına bilgi tablosunu almak için (bu dosyayı vim'de açtıktan sonra) kullanın:

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

Sıralanmamış olacaktır, ancak :sortkomut dosyası sayısı çok büyükse her zaman yerleşik komutu kullanabilirsiniz .


Vim'in bir profil oluşturma komutu olduğunu bilmiyordum, bunu işaret ettiğiniz için teşekkürler.
Benj

@Benj Devre dışı bırakılabilir. Dokümana göre, ya büyük özelliklere sahip vim'e ihtiyacınız var ya da bu seti etkinleştirmeden + profili açıkça etkinleştirdiğiniz kendi kendine derlenmiş olana ihtiyacınız var.
ZyX

2
Yapabilirsem +3 olur. dbext.vimÜç saniye süren
Johnsyweb

@ZyX, Windows kabuğunda (gvim) bunu nasıl yapabilirim? Windows gvim'de çalışmaz. Bu komutu windows kabuğuna gvim --cmd 'profile start profile.log' --cmd 'profile func *' --cmd 'profile file *' -c 'profdel func *' -c 'profdel file *' -c 'qa!'ekledim Vim'de çok fazla boş dosya oluşturuyor.
Reman

@Remonn Çift tırnak kullanın. Veya cygwin'den bash.
ZyX

39

Sorunuzu daha iyi cevaplamak için bu Github projesini oluşturdum . Temel olarak, her eklenti için her fonksiyon çağrısının zamanlamasını özetler; bu ham vim profil çıktısında belirgin olmayan (ancak önemli) değildir. Profil oluşturma sonuçları oluşturmak için Bash, Python, R, Ruby desteklenir.

Bunun gibi bir sonuç figürü alacaksınız:

vim-eklentileri-profil figürü

Bunun gibi metin çıktısı ile birlikte:

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!    

Düşük itibar nedeniyle rakamlar ekleyemedim. !Etikete bir a ekleyerek şekle ekleyebilirsiniz .
hyiltiz

2
+1 Bu çok havalı ;-) Sorum şu anda 6 yaşında (inanması zor) bu yüzden umarım bunu benim yararım için daha fazla yapıyordun. Yine de, sorunun şaşırtıcı derecede popüler olan diğer görüntüleyenler için yararlı olacağından eminim.
Benj

1
@ Benj Evet, profil oluşturmayı kendim yapmaya çalışıyordum, sonra sorunuzu buldum. Cevaplardan memnun kalmadım ve bazı iyileştirmeler yaptım. İnanıyorum ki 6 yıl trendi biraz değiştiriyor - şeker grafikleri almak çok uygun!
hyiltiz

Çok hoş! benim de vim kontrol> 60 msn ^ Bu hızlı paket bulmanıza yardımcı olabilir ^ ki (benim durumumda hala bir şey değildir: D) çok yavaşlıyor.
SidOfc

21

vim -VÇıktıyı zaman damgaları ekleyen ve çıktıyı analiz eden bir yardımcı program aracılığıyla çalıştırabilirsiniz . Bu komut satırları bunu yapar, örneğin:

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

Bilgi :qisteminize geri dönmek için körü körüne yazmanız gerekebilir . Daha sonra dosyayı viloggeçerli dizininizde her satırın başında işe alma zaman damgaları ile bulmalısınız .

Bir saniyelik bir ayrıntı düzeyi ile yapabilirseniz, bunu yapabilirsiniz:

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

1
Harika, ne harika bir çözüm.
Benj

3
"Perl -n" nin sizin için bir süre (<>) {} yaptığını biliyor muydunuz?
Benj

1
Şimdi siz söylediniz: evet, söyledim. Daha kısa komutlar almak için cevabı düzenleyeceğim. Teşekkürler.
innaM

20

@ Hyiltiz'in R'ye bağlı çalışmasına dayanarak , profillerin bir Python sürümünü yaptım , çünkü bu daha çok R olan bir sistemde mevcut.

Ayrıca genişletmek biraz daha kolaydır, bu nedenle özellikler:

  • Eklenti klasörünün otomatik algılanması,
  • Matplotlib sayesinde bar arsası ,
  • Ortalama / standart sapmayı elde etmek için analizi birkaç yürütme üzerinde çalıştırın ,
  • Destekler hem vim ve neovim ,
  • Tembel yükleme özelliklerini test etmek, belirli bir dosya türüne sahip bir dosyayı açmak vb. İçin tam bir vim komutu ile kullanılabilir .
  • Sonucu bir csv dosyasına aktarın.

Çıktı, vim-plugins-profile'nin sağladığı ile benzer:

$ 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-profil


Bu eklenti neovim pencereleri için çalışmaz. Hata mesajı No plugin found.
jdhao

16

Delta zamanını göstermek için vim -V çözümünü innaM ile rafine ettim :

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

1
Tatlı! Ben bunu biraz kısaltmak ve daha "Perlish" yapmak için özgürlük aldı.
innaM

5

Eklentilerinizi bir .vimrc dosyasından yüklüyorsanız q, unix timekomutu gibi bir işlem zamanlayıcısını kullanabilmeniz için dosyadan çıkabilmeniz için dosyaya bir satır parçası koymaktır . Daha ayrıntılı olarak, bu şöyle görünecektir:

  1. mevcut .vimrcdosyayı yedekle
  2. belirli sayıda eklenti dışında tümünü yorumla
  3. qçizgi ekle
  4. tekrar tekrar time vimve ortalama ara
  5. yedeklemeyi geri yükle

Bu zarif değil ama bence işi halledecek.


Hmm, bir tutamda fena değil. Zaten benim vimrc çok sayıda ayrı dosyaya bölünmüş var, bu yüzden otomatikleştirmek çok zor olmamalı.
Benj


1

--startimeBelirli bir dosyayı açarken izlemek uygun olabilir

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

0

Şu timeşekilde kullanılabilecek bir bash komutu yok mu:

time vim

EDIT : Komut dosyalarının başlama zamanını içermez. Bunun yerine @ jamessan önerisini kullanın.


Evet, ama bu sadece vim'in her iki komut dosyasının ne kadar sürede açılıp kapanacağını değil, her senaryoyu ayrıştırmanın ne kadar sürdüğünü gösterecektir.
Benj
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.