Membuat profil waktu startup Vim

143

Saya memiliki banyak plugin yang diaktifkan saat menggunakan Vim - Saya telah mengumpulkan plugin selama bertahun-tahun. Saya agak muak dengan berapa lama Vim dimulai sekarang, jadi saya ingin membuat profil startupnya dan melihat plugin mana yang saya miliki yang bertanggung jawab.

Apakah ada cara untuk membuat profil startup atau script-running Vim? Idealnya saya ingin tahu berapa lama Vim menghabiskan waktu di setiap skrip Vim yang dimuatnya.

Benj
sumber

Jawaban:

192

Jika Anda menggunakan Vim 7.2.269 atau lebih baru, maka ada opsi --startuptime yang dapat Anda gunakan.

vim --startuptime vim.log

dari bantuan ( vim -h):

--startuptime <file> Write startup timing messages to <file>
jamessan
sumber
4
Dan pada patch 7.2.286, tidak diperlukan tanda yang sama. "vim --startuptime vim.log"
jamessan
27
jika Anda ingin mencetaknya saja, cobavim --startuptime /dev/stdout +qall
Capi Etheriel
1
@barraponto Ada juga time vim +qjika Anda hanya ingin mengatur waktu startup vim secara keseluruhan.
Braden Best
Di terminal saya, ada perbedaan yang signifikan antara vim --startuptime /dev/stdout +qalldan vim --startuptime vim.log +qall; cat vim.log.
Hotschke
41

Saya membuat ini proyek Github dalam rangka untuk lebih menjawab pertanyaan Anda. Pada dasarnya, ini meringkas waktu untuk setiap panggilan fungsi untuk setiap plugin, yang tidak jelas (tapi penting) dari keluaran profil vim mentah. Bash, Python, R, Ruby didukung untuk membuat hasil pembuatan profil.

Anda akan mendapatkan hasil seperti ini:

vim-plugins-profile figure

Bersama dengan keluaran teks seperti ini:

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
sumber
Saya tidak dapat menambahkan angka karena reputasi rendah. Anda dapat menambahkan gambar hanya dengan menambahkan !sebelum tag.
hyiltiz
Sangat bagus! periksa vim saya juga,> 60 ms ^. ^ Ini dapat membantu Anda dengan cepat menemukan paket yang sangat memperlambat Anda (yang dalam kasus saya masih tidak ada apa-apa: D)
SidOfc
40

Anda dapat menggunakan mekanisme profil vim sendiri:

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

Setelah menjalankan perintah di atas, Anda akan menemukan file bernama profile.log di direktori saat ini dengan semua informasi yang diperlukan. Untuk mendapatkan tabel informasi per-skrip yang mirip dengan yang sudah ada per-fungsi, gunakan (setelah membuka file ini di 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])'))

Ini tidak akan disortir, tetapi Anda selalu dapat menggunakan :sortperintah bawaan jika jumlah skrip terlalu besar.

ZyX
sumber
Saya tidak menyadari vim memiliki perintah profil, terima kasih telah menunjukkan hal ini.
Benj
@Benj Ini dapat dinonaktifkan. Menurut dokumen, Anda memerlukan vim dengan serangkaian fitur yang besar atau yang dikompilasi sendiri di mana Anda secara eksplisit mengaktifkan + profil tanpa mengaktifkan set ini.
ZyX
2
Akankah +3 ini jika saya bisa. Ini membantu saya melacak check-in dbext.vim, yang memakan waktu lebih dari tiga detik github.com/johnsyweb/dotfiles/commit/09c3001
Johnsyweb
@ZyX, Bagaimana saya bisa melakukan ini di windows shell (gvim)? Itu tidak bekerja di windows gvim. Saya memasukkan perintah ini di windows shell. gvim --cmd 'profile start profile.log' --cmd 'profile func *' --cmd 'profile file *' -c 'profdel func *' -c 'profdel file *' -c 'qa!'Itu membuat banyak file kosong di vim.
Reman
@Remonn Gunakan tanda kutip ganda. Atau pesta dari cygwin.
ZyX
21

Anda dapat menjalankan vim -V, menyalurkan output melalui utilitas yang menambahkan cap waktu dan menganalisis output. Baris perintah ini melakukan ini, misalnya:

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

Anda mungkin harus mengetik membabi buta :quntuk kembali ke prompt Anda. Setelah itu, Anda harus menemukan file tersebut vilogdi direktori Anda saat ini dengan stempel waktu perekrutan di awal setiap baris.

Jika Anda dapat melakukan dengan perincian satu detik, Anda dapat melakukan ini:

vim -V 2>&1 | perl -ne 'print time, ": ", $_' | tee vilog
innaM
sumber
3
Tahukah Anda bahwa "perl -n" melakukan sementara (<>) {} untuk Anda.
Benj
1
Sekarang setelah Anda menyebutkannya: ya, saya lakukan. Saya akan mengedit jawabannya untuk mendapatkan perintah yang lebih pendek. Terima kasih.
innaM
20

Berdasarkan pekerjaan yang dilakukan oleh @hyiltiz yang bergantung pada R, saya membuat profiler versi Python , karena ini lebih sering tersedia pada sistem yang R.

Ini juga sedikit lebih mudah untuk diperluas, jadi fiturnya adalah:

  • Deteksi otomatis dari folder plugin,
  • Plot batang berkat matplotlib,
  • Jalankan analisis pada beberapa eksekusi untuk mendapatkan rata - rata / deviasi standar ,
  • Mendukung vim dan neovim ,
  • Dapat digunakan dengan perintah vim lengkap untuk menguji fitur pemuatan lambat, membuka file dengan jenis file tertentu, dll.,
  • Ekspor hasil ke file csv.

Outputnya mirip dengan yang disediakan 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
sumber
Plugin ini tidak berfungsi untuk jendela neovim. Pesan kesalahannya adalah No plugin found.
jdhao
16

Saya menyempurnakan solusi vim -V oleh innaM untuk menunjukkan waktu delta:

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

Jika Anda memuat plugin Anda dari file .vimrc, apa yang dapat Anda lakukan adalah meletakkan qbeberapa baris di sebagian file untuk membuatnya berhenti sehingga Anda dapat menggunakan pengatur waktu proses, seperti timeperintah unix . Lebih lengkapnya, ini akan terlihat seperti:

  1. backup .vimrcfile yang ada
  2. komentari semua kecuali sejumlah plugin tertentu
  3. sisipkan sebuah qbaris
  4. panggil time vimrepeteadly dan rata-rata
  5. pulihkan cadangan

Ini tidak elegan tapi saya pikir itu akan menyelesaikan pekerjaan.

David Berger
sumber
Hmm, lumayan dalam keadaan darurat. Saya sudah membagi vimrc saya menjadi banyak file terpisah jadi seharusnya tidak terlalu sulit untuk diotomatiskan.
Benj
1

Akan lebih mudah untuk melacak --startimesaat membuka file tertentu

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

Apakah tidak ada timeperintah bash yang bisa digunakan seperti ini:

time vim

EDIT : Tidak termasuk skrip waktu mulai. Gunakan saran @jamessan sebagai gantinya.


sumber
Ya, ada tetapi itu hanya akan memberi tahu Anda berapa lama vim untuk membuka dan menutup, bukan berapa lama waktu yang dibutuhkan untuk mengurai setiap skrip.
Benj