木瓜丸(@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