Vimの起動が遅い場合の原因と対策

Vimの起動にかかる時間は本来すごく短い。しかし使い方によっては長く(遅く)なってしまう。そうなる原因と対策を紹介する。

Vimは起動にかかる時間が短いソフトウェアです。この言葉に納得できない人はこの文章の残りをちょっと読んで行きませんか? 「Vimの起動、長い(遅い)なぁ」と感じているあなた、その原因が何か調べたことはあるでしょうか。Vimが遅くなる原因の95%はスクリプトの読み込み&実行にあります。「autoload化する」「–startuptimeを使ったことがある」?なかなかやりますね。でもautoloadは単に遅延させるだけで結局かかる総時間はかわりませんし、startuptimeで主にわかるのは各スクリプトの読み込みにかかった時間です。そのスクリプトがなぜ遅くなっているのか、どうすると速くなるのかを紹介しましょう。

遅くなる原因

回りくどいのはここまでです。遅くなる原因を列挙しましょう。

  1. 一行あたりが長い
  2. 行の連結が多い(行頭の)
  3. 関数内のロジックが複雑
  4. 関数が長い
  5. 遅いVimコマンドが実行されている

思い当たるフシはあったでしょうか? あってもなくても、なぜ上記が遅くなる原因なのか、それを知っておくのはどうでしょう。必要なければ次の節「速くするための対策」まで飛ばしてください。

原因の原因:スクリプトの読み込み方

なぜ上記が遅くなる原因なのかを知るにはVimがどうスクリプトを読み込み、実行するのかを知る必要があります。

Vimはスクリプトを読む時、行単位で読み込み、読んだ端からすぐに実行してしまいます。問題は長い行・連結された行で、それを見つけたVimは内部でメモリ確保と開放それにメモリコピーを繰り返し一つの行として実行します。3GHz時代にメモリ操作なんてたいして遅くないだろうと感じたあなた、甘い。メモリ操作は現代においても高く付くのです。

function命令を実行する、というのはendfunctionまでをまるごとメモリに保存することです。ところがこの「endfunctionまで」が関数の入れ子を考えるとかなり複雑です。ですからVimはfunction命令を実行する(読み込む)時、関数内部の制御系命令(if-else-endif, while-endwhileなど)とfunction-endfunctionを擬似的に解釈&実行し、functionに対になるendfunctionを探し出します。これに時間がかかるのは当然です。

またこの時、保存した関数の内容はそのままメモリに保持され続け、Vimが使用するメモリを増大させます。いわゆる「重い」の原因となりますが…まぁコレはautoloadでかなり遅延させられるということにしておきます。

遅いVimコマンドの代表はメニュー操作(追加)です。OSにより程度は異なりますが、メニューに項目を追加するのは高価です。「シンタックス」に「対応形式をメニューに表示」という項目があるのはそのためだったりします。また根本的な対策として~/.gvimrcに次のように書いて、メニューを表示させず使わないという手もありです。Vimユーザならメニューを使わずに操作するなどできて当然でしょう(キリッ

set guioptions-=m

速くするための対策

もうすごく単純に遅くなる原因の逆を行なってください。

  • 一行を短くする(最大で200文字程度までOK…だったかな)
  • 行の連結は使わない
  • 関数ないのロジックは単純に
  • 関数は短く
  • 遅いVimコマンドは実行しない

これだけで激的に速くなる場合があります。autofmtとか行の連結に対策しただけで読み込み時間の60%を短縮できた実例もあります。

まとめ

快適な速度維持のため、Vimスクリプトのご利用は用量・用法を守ってほどほどに。