Vim起動時間のプロファイリング


139

Vimを使用すると、多くのプラグインが有効になります。長年にわたってプラグインを収集してきました。Vimが起動するまでの時間に少しうんざりしているので、Vimの起動をプロファイルし、自分が担当している多くのプラグインのうちどれを担当しているかを確認したいと思います。

Vimのスタートアップまたはスクリプト実行をプロファイルする方法はありますか?理想的には、ロードするVimスクリプトごとにVimが費やす時間を知りたいです。

回答:


188

Vim 7.2.269以降を使用している場合は、-startuptimeオプションを使用できます。

vim --startuptime vim.log

ヘルプ(vim -h)から:

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

4
パッチ7.2.286以降、等号は必要ありません。「vim --startuptime vim.log」
jamessan 2009

25
印刷するだけの場合は、試してくださいvim --startuptime /dev/stdout +qall
Capi Etheriel 2013年

@barraponto time vim +qvimの起動全体を計るだけの場合もあります。
ブレーデンベスト

私の端末では、との間に大きな違いがvim --startuptime /dev/stdout +qallありvim --startuptime vim.log +qall; cat vim.logます。
Hotschke 2018

40

vim独自のプロファイリングメカニズムを使用できます。

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

上記を実行すると、現在のディレクトリに、必要なすべての情報を含むprofile.logというファイルが見つかります。すでに存在する関数ごとのテーブルと同様のスクリプトごとの情報テーブルを取得するには、(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])'))

ソートされませんが:sort、スクリプトの数が多すぎる場合は、常に組み込みコマンドを使用できます。


これを指摘してくれてありがとう、vimにプロファイリングコマンドがあることに気づきませんでした。
ベンジ

@Benj無効にできます。このドキュメントによると、巨大な機能セットを備えたvimか、このセットを有効にせずに+ profileを明示的に有効にした自己コンパイルされた機能のいずれかが必要です。
ZyX

2
できれば+3になります。チェックインを追跡するのに役立ちましdbext.vimた。3秒以上かかっていましたgithub.com/johnsyweb/dotfiles/commit/09c3001
Johnsyweb

@ZyX、どうすればWindowsシェル(gvim)でこれを実行できますか?Windows gvimでは機能しません。このコマンドをWindowsシェルに挿入gvim --cmd 'profile start profile.log' --cmd 'profile func *' --cmd 'profile file *' -c 'profdel func *' -c 'profdel file *' -c 'qa!'しました。vimには多くの空のファイルが作成されます。
Reman 2013

@Remonn二重引用符を使用します。または、cygwinからbashします。
ZyX 2013

39

これを作成しまし Githubプロジェクト、質問への回答を改善しました。基本的に、すべてのプラグインの各関数呼び出しのタイミングを合計します。これは、生のvimプロファイル出力からは明らかではありませんが(重要です)。プロファイリング結果の作成では、Bash、Python、R、Rubyがサポートされています。

次のような結果が得られます。

vim-plugins-profileの図

次のようなテキスト出力とともに:

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、2015年

2
+1これはかなりかっこいいです;-)私の質問は6歳になりました(信じられません)。それでも、驚くほど人気のある質問の他の視聴者にも役立つと確信しています。
ベンジ2015年

1
@Benjはい、私は自分でプロファイリングをしようとしていましたが、あなたの質問が見つかりました。私は答えに満足せず、いくつかの改善をしました。6年でトレンドが少し変わったと思います-キャンディーグラフを入手するのはとても便利です!
hyiltiz、2015年

非常に素晴らしい!あまりにも私のvimのを確認し、> 60ミリ秒^これは、あなたがすぐにパッケージを見つけることができます^その(私の場合には、まだ何もありません:D)たくさん遅くなりますが。
SidOfc

21

を実行しvim -V、タイムスタンプを追加するユーティリティに出力をパイプして、出力を分析できます。このコマンドラインはこれを行います、例えば:

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

:qプロンプトに戻るには、盲目的にタイプする必要があるかもしれません。その後、vilog各行の先頭に採用タイムスタンプが付いたファイルが現在のディレクトリにあるはずです。

秒単位で実行できる場合は、次のように実行できます。

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

1
素晴らしい、なんて素晴らしいソリューションでしょう。
ベンジ2009年

3
「perl -n」がwhile(<>){}を実行することをご存知ですか。
ベンジ2009年

1
あなたがそれを言ったので:はい、私はしました。答えを編集して、より短いコマンドを取得します。ありがとう。
innaM 2009年

20

Rに依存する@hyiltizによって行われた作業に基づいて、プロファイラーのPythonバージョンを作成しました。これは、Rのシステムでより頻繁に利用できるためです。

また、拡張が少し簡単なので、機能は次のとおりです。

  • プラグインフォルダーの自動検出、
  • matplotlibのおかげでバープロット
  • 複数回実行して分析を実行し、平均/標準偏差を取得します。
  • vimneovimの両方をサポートし、
  • 完全なvimコマンドで使用できます遅延読み込み機能をテストしたり、特定のファイルタイプでファイルを開いたりできます。
  • 結果をcsvファイルにエクスポートします。

出力は、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


このプラグインは、neovimウィンドウでは機能しません。エラーメッセージはNo plugin foundです。
jdhao

16

差分時間を示すためにinnaMによってvim -V ソリューションを改良しました:

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

1
甘い!私はこれを少し短くしてより「パーリッシュ」にするために自由を取りました。
innaM 2009年

5

プラグインを.vimrcファイルからロードしている場合q、ファイルを途中で途中まで挿入して終了させると、unix timeコマンドのようにプロセスタイマーを使用できます。より完全に、これは次のようになります:

  1. 既存の.vimrcファイルをバックアップ
  2. 選択した数のプラグインを除くすべてをコメント化
  3. q行を挿入する
  4. time vim繰り返して平均的に電話する
  5. バックアップを復元

これはエレガントではありませんが、私はそれが仕事を成し遂げると思います。


うーん、ピンチで悪くありません。私はすでにvimrcを多数の個別のファイルに分割しているので、自動化するのは難しくありません。
ベンジ2009年


1

--startime特定のファイルを開くときにをトレースすると便利です

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

0

次のtimeように使用できるbash コマンドはありませんか?

time vim

編集:スクリプトの起動時間は含まれません。代わりに@jamessan提案を使用してください。


はい、ありますが、これは、vimがオープンとクローズの両方にかかった時間を示すだけで、各スクリプトの解析にかかった時間ではありません。
ベンジ2012年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.