スクリプト言語Lua2

昨日、Luaは遅いと書きましたが正確な計測結果を公開したいと思います。速度としてはとりあえず、関数呼び出しの速度しか考えていません。

呼び出しもと→呼び出し先 1000000回の呼び出しで掛かった時間
C→C 3[ms]
C→Lua 253[ms]
Lua→C 114[ms]
LuaLua 161[ms]

なんだか大学のレポートっぽくなってきましたが(笑 この表の見方、分かるでしょうか? C→LuaというのはC言語側からLuaの関数を呼び出したと言うことです。LuaLuaLua→Cなども同様です。

この結果を見ると、CからCの呼び出しが最速、CからLuaの呼び出しが最遅(造語?)です。個人的にはLuaLuaよりもC→Luaの方が時間が掛かるのが驚きでした。C→Luaで掛かった時間の内訳を調べてみると

  • strlen に 約30[ms]
  • lua_pushlstring に 約100[ms]
  • lua_gettable に 約50[ms]
  • lua_call に 約70[ms]

となりました。LuaからLuaを呼ぶ場合には lua_pushstring(lua_pushlstring + strlen) をする必要がなく、その分軽くなっているようです。


これについて調べているうちに有用なページを発見したのでリンクを張らせていただきます。
http://www.radiumsoftware.com/0407.html#040709
以下、引用の引用です。

Lua をフレーム毎のアクションに利用するのは避けた方が良い。パフォーマンスが劇的に低下してしまう。例えば, Lua をアニメーションの更新に利用してはいけない。 Lua はアニメーションのパラメータのセットアップにとどめ,更新は C/C++ 側で行うようにするべきである。
Lua を大規模な用途に利用するのは避けた方が良い。短期間かつ小規模なアクションに利用した方が良い。
極端に大きなサイズのテーブルの利用は避けた方が良い。テーブルへのアクセス速度が落ちてしまう。

やはりLuaのパフォーマンスはあまり良くないというのが共通認識のようです。ただ、組み込みでこれだけ便利な言語というのもなかなかないので、毎フレーム呼び出すようなまねをせずよいお付き合いをしていきましょう、ということですね。(なんじゃこの結論)


今回の実験に使ったソース&実行ファイルを公開します。著作権などは主張しませんので煮るなり焼くなり好きにしてください。
http://cielacanth.s60.xrea.com/programs/lua_test.lzh