luajit-remakeを試してみた
はじめに
LuaJITでたらい回し関数のベンチマークを試してみた · hnakamur’s blogのついでにluajit-remake/luajit-remake: An ongoing attempt to re-engineer LuaJIT from scratchも試してみたのでメモです。
ビルド
Dockerはインストール済みという前提で、以下のコマンドを実行すると、カレントディレクトリにluajitr
という実行ファイルが生成されます。
git clone https://github.com/luajit-remake/luajit-remake
cd luajit-remake
./ljr-build make release
ビルドに使用するLLVMなどのツールチェインは haoranxu510/ljr-build - Docker Image | Docker Hubのv0.0.3のイメージをpullしてくるようになっていました。
これを手元でビルドする場合は、上記のコマンドを実行する前に以下のようにすればOKでした。
cd dockerfile
docker build -t ljr-build:v0.0.3 .
ただ、ljr-buildのDockerイメージのv0.0.3がgitのどのコミットに対応しているかが分からなかったので、正しくは手元でljr-buildのDockerイメージをビルドする際はv0.0.3と付けずにビルドして./ljr-build
のスクリプトのほうをコピペ改変してv0.0.3ではなく手元のビルドを使うように改変したほうが良さそうです。
ツールチェインのDockerイメージのビルドにはdockerfile/build_docker_image.shというスクリプトを使っていますが、CMakeをソースからインストールして、独自パッチを当てたLLVM 12でLLVM 15.0.3をビルドしたりしています。またrui314/mold: mold: A Modern Linker 🦠も使われていました。
付属のベンチマークを実行
ここではhaoranxu510/ljr-build - Docker Image | Docker Hubのv0.0.3のイメージのツールチェインを使って以下のコミットのソースでビルドしたluajitrで試しました。
$ git log -1
commit f2701c3dfdfb4e14ec0875804704177720582bd8 (HEAD -> master, origin/master, origin/HEAD)
Author: Haoran Xu <haoranxu510@gmail.com>
AuthorDate: Thu Dec 1 21:52:55 2022
Commit: Haoran Xu <haoranxu510@gmail.com>
CommitDate: Thu Dec 1 21:52:55 2022
more refactoring in preparation for baseline jit
./run_bench.sh
と実行するとコンソールに出力されつつbenchmark.log
というログファイルが生成されます。
run_bench.sh
ではテストデータをluaで作るようになっているのですがそこをluajitに書き換えた版と、luajitrではなくluajitを使うようにしたrun_bench_luajit.sh
を作って、luajitrとluajitでベンチマークを実行して見ました。
結果はhnakamur/luajit-remake at compare-benchmark-with-luajitのbenchmark-luajitr.logとbenchmark-luajit.logに置いています。ほとんどのテストではluajitのほうが速いですが、一部のテストはluajitrのほうが速かったです。
たらい回し関数のベンチマークを試してみた
LuaJITのFFIやos.time
はluajitrでは未実装でした。
$ ~/ghq/github.com/luajit-remake/luajit-remake/luajitr tarai-ffi-time.lua
Uncaught error: Library function 'require' is not implemented yet!
$ ~/ghq/github.com/luajit-remake/luajit-remake/luajitr tarai-os-time.lua
Uncaught error: Library function 'os.time' is not implemented yet!
ということで/usr/bin/time
で処理時間とメモリ消費量を調べてLuaJITと比べました。LuaJITでたらい回し関数のベンチマークを試してみた · hnakamur’s blogのclock_gettime
を使う方式とは異なり、luajit
とluajitr
の起動時間も含まれるので、そちらの記事とは別の比較になります。
$ set -x; for i in {1..3}; do /usr/bin/time -f '%e %M' ~/ghq/github.com/luajit-remake/luajit-remake/luajitr tarai-no-time.lua ; /usr/bin/time -f '%e %M' luajit tarai-no-time.lua; done; set +x
+ for i in {1..3}
+ /usr/bin/time -f '%e %M' /home/hnakamur/ghq/github.com/luajit-remake/luajit-remake/luajitr tarai-no-time.lua
ans=14
5.51 3140
+ /usr/bin/time -f '%e %M' luajit tarai-no-time.lua
ans=14
2.12 2164
+ for i in {1..3}
+ /usr/bin/time -f '%e %M' /home/hnakamur/ghq/github.com/luajit-remake/luajit-remake/luajitr tarai-no-time.lua
ans=14
5.50 3256
+ /usr/bin/time -f '%e %M' luajit tarai-no-time.lua
ans=14
1.91 2092
+ for i in {1..3}
+ /usr/bin/time -f '%e %M' /home/hnakamur/ghq/github.com/luajit-remake/luajit-remake/luajitr tarai-no-time.lua
ans=14
5.50 3132
+ /usr/bin/time -f '%e %M' luajit tarai-no-time.lua
ans=14
2.23 2104
+ set +x
このベンチマークに関しては、現状ではOpenRestyのフォーク版LuaJITのほうが速くてメモリ消費量も少ないようです。
ただ、Building the fastest Lua interpreter.. automatically!の記事を読むとtail-call approachは良さそうな感じなので将来に期待したいところです。