Hack #99: 起動に時間のかかるプラグインを探す
Posted at 2009/11/07ツイート
Vim には便利なプラグインがたくさんありますが、大量にインストールすると起動に時間がかかるようになってしまいます。そこで、Vim のプロファイリング機能を使って起動に時間のかかっているプラグインを探す方法を紹介します。
-
追記
Vim 7.2.269 から –startuptime と言う起動時のプロファイルを簡単に行うためのコマンドライン引数が追加されました。
vim --startuptime=result.txt
7.2.286 からは引数の形式が変更されています。
vim --startuptime result.txt
このようにすることで、Huge版でなくても手軽にプロファイルを行う事が出来ます。
本 Hack はこのパッチが公開される前に書かれたので少々複雑な手順を踏んでいますが、この方法で生成された result.txt には行単位でどれだけ時間がかかったのかも書かれているのでより詳しい調査ができる、という利点もあります。
準備
まず、+profile 機能の付いた Vim を用意する必要があります。これは Huge 版の Vim に付いている機能です。手元の Vim が Huge 版でない場合は、ソースから自分でコンパイルする必要があります。 コンパイル方法については本 Hack の範囲を超えるので省略します。
プロファイルを行う
以下のようにして vim を起動します。
vim --cmd "profile start result.txt" --cmd "profile file */plugin/*.vim" -c quit
このコマンドを実行すると、特にエラーが発生しない限り vim はすぐに終了します。そしてプロファイル結果が result.txt に出力されます。
また、ついでに自分の vimrc も確認したい、という場合は –cmd を増やせば大丈夫です。
vim --cmd "profile start result.txt" --cmd "profile file */plugin/*.vim" --cmd "profile file .vimrc" -c quit
ファイル名は適時変更してください。また、コマンドの実行タイミングにより $MYVIMRC は使えません。
結果を解析する
プロファイル結果の概要を知るために結果のファイルを加工してみます。
以下のような vim スクリプトを作成し、結果ファイルを開いてから作成したスクリプトを :source
します。
let s:list = []
global/^SCRIPT/
\ call add(s:list, printf("%s\t%s",
\ matchstr(getline(line('.')+2), '\d\+\.\d\+'),
\ matchstr(getline('.'), 'SCRIPT\s*\zs.*$')))
new
put =reverse(sort(s:list))
1 delete _
これを実行すると新しいバッファが開かれて、そこに実行時間とスクリプトのファイル名が時間のかかった順に表示されます。
もっと細かい結果が知りたい場合はプロファイル結果を直接眺めたり別の方法で加工すると良いでしょう。
なお、今回の方法では 'runtimepath'
の plugin ディレクトリ内にあるファイルのみを対象にし、各プラグインが外部の Vim スクリプトを実行している時間も含めた時間を出しました。
もどる
blog comments powered by Disqus