Vimのプロファイル機能を使って反応の悪いプラグインを特定する

  • 6
    いいね
  • 0
    コメント

Clojureでの開発をNeoVim上で行う際、ファイルを開くのに時間がかかる場合があり、開発効率が落ちていました。その原因をVimのプロファイル機能を使って特定できたので、使い方を共有します。

手順

  • Vimを起動し、遅い動作の手前まで作業を進める。
  • 下記の3行をVimのコマンドウィンドウ内で入力する。
:profile start profile.log
:profile func *
:profile file *
  • 遅い動作を実行する。
  • 下記の2行をVimのコマンドウィンドウ内で入力する。
:profile pause
:noautocmd qall!
  • カレントディレクトリ内に profile.log が作成されているはずなので、その内容を確認する。ファイルの末尾に概要が出力されているので、そこから遅いロジックを特定していく。

profile.logの出力例

FUNCTIONS SORTED ON TOTAL TIME
count  total (s)   self (s)  function
    1   8.584595   0.000036  nerdtree#ui_glue#invokeKeyMap()
    1   8.584559   0.000131  77()
    1   8.568358   0.000042  76()
    1   8.568316   0.000028  <SNR>75_activateFileNode()
    1   8.568288   0.000047  105()
    1   8.568241   0.000034  122()
    1   8.568115   0.000017  175()
    1   8.568098   0.000055  176()
    1   8.488279   0.006735  16()
    2   8.093759   0.002042  ProjectionistDetect()
    2   7.712956   0.002847  projectionist#activate()
   40   7.418631   0.004057  projectionist#query()
   40   7.407037   2.785267  projectionist#query_raw()
   36   6.686320   0.001272  projectionist#query_exec()
    2   5.947827   0.001345  <SNR>168_query_exec_with_alternate()
48720   3.367385   2.290765  <SNR>168_match()
490400   1.252515             projectionist#lencmp()
97440   0.871693   0.602253  <SNR>168_slash()
    4   0.735650   0.000254  projectionist#query_file()
   17   0.457497   0.286622  provider#python#Call()

FUNCTIONS SORTED ON SELF TIME
count  total (s)   self (s)  function
   40   7.407037   2.785267  projectionist#query_raw()
48720   3.367385   2.290765  <SNR>168_match()
490400              1.252515  projectionist#lencmp()
97440   0.871693   0.602253  <SNR>168_slash()
   17   0.457497   0.286622  provider#python#Call()
   14              0.284700  <SNR>166_nrepl_transport_dispatch()
97606              0.269994  projectionist#slash()
48720              0.202756  <SNR>168_startswith()
    1   0.170747   0.170734  provider#pythonx#Require()
    2   0.171497   0.150765  projectionist#navigation_commands()
    8              0.108033  projectionist#define_navigation_command()
    2   0.377909   0.044814  <SNR>152_projectionist_detect()
    1              0.028492  <SNR>95_DirenvExport()
  752              0.028444  <SNR>130_get_syn()
  376   0.058135   0.025600  airline#highlighter#get_highlight()
 2436              0.020623  <SNR>168_gsub()
    5   0.018016   0.017663  fireplace#ns()
   18              0.014815  <SNR>106_Highlight_Matching_Pair()
  168   0.043886   0.013509  airline#highlighter#exec()
    1   0.012891   0.012863  ctrlp#utils#writecache()

この場合は、vim-projectionistという、プロジェクトのファイル構成を分析してファイル操作を支援したり、ソースファイルとテストファイル間のジャンプを実現してくれるプラグインに時間がかかっていることがわかります。私は最近では、ctrlpというプラグインでファイル操作を主に行っているので、このプラグインをコメントアウトすることにし、動作速度の改善を図ることができました。