Vimが重かったので改善してみた

投稿日: 2021年 10月 10日

木瓜丸(@boke0_ja)です。

最近自分のプロダクトに集中できるようになりました。もうすぐリリース予定です。フロントエンドをゴリゴリ書いている最中です(--;)

さて、そんなわけでTypeScript + Reactで開発しているのですが、全体のコード量もすごい勢いで増えてきました。 そうなるとテキストエディタ的にも大変なのか、Vimの動作がカクつくことが多くなってきました。

そこで、今回Vimの動作改善を行ってみたので、備忘録もかねてまとめておきます。

プロファイリングする

今年の夏は「推測するな、計測せよ」をひたすら呪文の様に唱えてすごしていましたので、この学びを活かして症状が発生する部分を計測します。 正直テキストエディタでこれをやるとは思っていませんでした。

Vimにはそもそもプロファイリング機能が付いているみたいで、これを実行します。

:profile start profile.log
:profile func *
:profile file *

↑のコマンドを打ってから、vimで軽く遊んであげます。イイカンジにカクついたところで、プロファイリングを終了してあげます。

:profile pause

すると、profile startで指定したファイル名の場所にプロファイリング結果が保存されるようになります。

結果の分析

プロファイリング結果がこちら

FUNCTIONS SORTED ON TOTAL TIME
count  total (s)   self (s)  function
   49   0.197268   0.007248  airline#check_mode()
  104   0.194080   0.000412  <SNR>247_next()
    8   0.188996   0.020885  airline#highlighter#highlight()
   80   0.125668   0.000083  <SNR>247_callback()
  525   0.110940   0.042503  airline#highlighter#get_highlight()
   18   0.109347   0.018980  <SNR>92_debounceTimeTimerCallback()
  295   0.108992   0.032119  airline#highlighter#exec()
  296   0.099777   0.009675  <SNR>92_filterSourceCallback()
  115   0.097639   0.006318  <SNR>73_exec_separator()
   54   0.090747   0.027104  <SNR>92_mapFSourceCallback()
   34   0.083938   0.000365  lsp#stream()
   34   0.083329   0.013842  <SNR>92_makeSubjectFactory()
   35   0.082747   0.001043  <SNR>248_out_cb()
   35   0.081704   0.007676  <SNR>117_on_stdout()
   26   0.079735   0.007672  <SNR>92_tapSourceCallback()
   24   0.069209   0.000104  lsp#utils#step#start()
   22   0.068050   0.001849  <SNR>91_on_notification()
 2100   0.062307             <SNR>73_get_syn()
  204   0.061427   0.005514  <SNR>92_shareSourceCallback()
  230   0.050991   0.002252  airline#themes#get_highlight()

FUNCTIONS SORTED ON SELF TIME
count  total (s)   self (s)  function
 2100              0.062307  <SNR>73_get_syn()
  525   0.110940   0.042503  airline#highlighter#get_highlight()
  295   0.108992   0.032119  airline#highlighter#exec()
   54   0.090747   0.027104  <SNR>92_mapFSourceCallback()
    8   0.188996   0.020885  airline#highlighter#highlight()
   18   0.109347   0.018980  <SNR>92_debounceTimeTimerCallback()
   34   0.083329   0.013842  <SNR>92_makeSubjectFactory()
  296   0.099777   0.009675  <SNR>92_filterSourceCallback()
  198   0.013550   0.009240  <SNR>92_shareTalkbackCallback()
   35   0.081704   0.007676  <SNR>117_on_stdout()
   26   0.079735   0.007672  <SNR>92_tapSourceCallback()
   49   0.197268   0.007248  airline#check_mode()
  295              0.007154  <SNR>73_CheckDefined()
   14   0.024858   0.006835  <SNR>91_ensure_changed()
  115   0.097639   0.006318  <SNR>73_exec_separator()
  525              0.006130  <SNR>73_get_array()
   39   0.006043   0.005603  lsp#log_verbose()
  204   0.061427   0.005514  <SNR>92_shareSourceCallback()
   12   0.010215   0.004569  <SNR>99_place_highlights()
    5              0.004511  <SNR>258_FirstDifference()

みてみると、vim-airlineがやたらと時間を食っています。

正直LSPが原因だと思っていたのですが、全然的外れでした。

どうやら、vim-airlineのハイライティングの処理に時間がかかってるみたいです。

しらべてみた

get_synを検索してみたら見事↓のGithub Issueがヒットしました。

Airline caused massive lag when editing ruby files #1026

議論を追ってみたところ、ハイライティングをキャッシュする機構がvim-airlineにあるらしく、それを有効にすれば良くなったとのこと。

let g:airline_highlighting_cache=1
© 2021 木瓜丸