Edited at

LuaスクリプトをLuaJITを使ってexe化する

More than 1 year has passed since last update.

Luaをexe化する際は、LuaDist/srluaというLuaのコンパイラとLuaスクリプトを一つのexeとして固めるツールが有名ですが(といいますか、これ以外知らない)、Luaの場合は実行速度がRubyよりも遅く、遅さが気になる場合があります。

なのでLuaJIT版を作りました。

なお、こちらは複数のLuaスクリプトをアーカイブしてexe内に取り込むようになっています。

wordijp/cLuaJIT(github)


使い方

コマンド名はcluajitです、これは作成時にソースを流用させて頂いたuLuaの名前にあやかっています。

# luajitと同じくスクリプトを実行

$ cluajit hello.lua
hello world

# 一端exe化して実行
$ cluajit hello.lua hello.exe -link
$ hello.exe
hello world

# モジュール用スクリプトもある場合は
$ cluajit hello.lua foo.lua hello.exe -link
$ hello.exe
hello world
from foo


速度比較

exe化したバイナリは内部でLuaJITが使われている為高速です、試しにこちらのフィボナッチ数列のベンチマークをもとにこちらでも計測してみます。

なお、各言語のバージョンは以下の通りです。


  • Ruby(2.3.1)

  • Lua(5.2.4)

  • LuaJIT(2.0.4)

  • cluajit(内部のLuaJITは 2.0.4)

計測に用いたソースコードも再掲しておきます。


Ruby

def fib(n)

if (n < 2) then
return n
end
return fib(n - 2) + fib(n - 1)
end

puts fib(42)



Lua

function fib(n)

if n < 2 then
return n
end
return fib(n - 2) + fib(n - 1)
end

print(fib(42))


これらのソースコードの実行時間を計測します、なお、cluajitは一端exe化してから実行しています。

言語
実行時間

Ruby
31.023sec

Lua
43.881sec

LuaJIT
2.734sec

cluajit
2.858sec

やはりLuaJITは速いです、exe化したら少し遅くなってますがこれくらいの誤差なら気にならないかと思います、なによりも配布時にバイナリ渡すだけで済むのは楽です。