私の作成するpluginでは、巨大なデータをあれこれすることが多いので、Vimでどの程度の時間がかかるかを計測してみた。 以下のグラフを見れば、大体の傾向が掴めるかと思います。 細かい数値は環境によっても変わるとは思いますが、ここではざっくりとした傾向と大雑把な処理時間がわかればいいと割り切っています。 ちなみにArch Linuxでの計測です。
グラフからわかることは、
if_lua以外はデータ量に線形比例する時間がかかる
readfile()はそれほど時間がかかるものではない
単純にIO + メモリ確保程度だと思われる。
libcall()では文字列経由で渡す必要があるので、かなり時間のかかる処理になっている
if_luaは参照経由でのデータ受け渡しが可能なため、非常に高速にデータの受け渡しが行える
グラフ中で処理時間にぶれがあるのは、恐らくIOの待ち時間でしょう。
libcall()で巨大なデータを扱う必要がある場合、ファイル経由での受け渡しをする等の対策が必要になるかもしれません。
if_luaについては、参照で受け渡せるため、データの受け渡しには時間はかかりません。
libcall()とif_luaのどちらが高速か、は、luajitが使えるかどうかと、処理の内容によるので一概には言えませんが、データの受け渡しという観点から見た場合はif_luaが有利なように思えます。 もちろん、ファイル経由で受け渡す等、高速化のためのチューニングを行えば、libcall()でも十分な速度が稼げると思います。
今回用いたベンチマークスクリプトはgistに上げていますので、興味のある方はご参照ください。