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-luajitbenchmark-luajitr.logbenchmark-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 blogclock_gettimeを使う方式とは異なり、luajitluajitrの起動時間も含まれるので、そちらの記事とは別の比較になります。

$ 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は良さそうな感じなので将来に期待したいところです。