vim script の関数呼び出しは遅いとか遅くないとか

vimプラグインである vimfiler を最近使い出したんですが、vimfiler バッファにおける j/k での移動がなんかひっかかる感じになっていました(vimfiler ではバッファの一番上で k を押すと一番下にジャンプし、一番下で j を押すと一番上にジャンプするという挙動をします)。MacVim では特に問題なかったんですが、Linux Mint 上の gvim ではひっかかる感まるだし。

ひっかかる感がストレスフルだったので j/k を unmap して、とりあえずひっかかる感を解消させました。上下のループはできなくなったけど、ひっかかる感が残るよりはましです。それでそのことについて twitter で以下のようにつぶやいたら

vimfiler の作者である [twitter:@ShougoMatsu] さんから速攻で reply が。
この間10分ほど。はええ。

それで早速試したところ確かに引っかかる感じがごく小さくなっていました。ちなみにアップデートコマンドは以下の通り。

wget -qO - http://github.com/Shougo/vimfiler/tarball/master | tar -xzC ~/.vim --strip-components=1

何をしたんだろうと diff を見ると関数呼び出しをやめているようでした。それで関数呼び出しでどの程度コストがかかるのかちょっと気になったので調べてみました。実行したスクリプトは以下のようなものです。

実行するには gvim の起動オプションに -S を指定。

gvim -S performance-comparison.vim

結果は以下のようになりました。

without function  :   7.358529
with    function1 :  11.212190
with    function2 :  13.246932

function1 は単純に関数にしてそれを呼び出すようにしたもので、function2 は三項演算子を使っていた部分を if/else に置き換えたもの。見てのとおり、関数呼び出しにしたら 1.5 倍くらい時間がかかりました。三項演算子を if/else したらさらに遅くなりました。

パフォーマンスを追求する場合、関数呼び出しはできるだけ減らした方が良さそうですね。まあ、1000000回で4秒、つまり1回あたり0.004ミリ秒なんですけどね。うん、相当おかしなことしない限り気にしなくていいよ。扇動的なタイトルでごめんなさい。