Lua(Luajit)のSplit実装ベンチマーク比較

Luaはsplit関数がバンドルされていません。 そのためいくつか実装が存在しています。

今回、実装違いにより色々問題が出たため再検討していたのですが、 その際にどの実装がパフォーマンス良いのか気になったので比較してみました。
(今回存在を知ったのですが特にOpenRestyのコア実装がどのくらい出るのか試してみたかった)


バージョンなど

Docker Image openresty/openresty:1.15.8.1-3-alpine-fat で実行

ベンチマークコード

コード/セットアップ/実行方法はこちら。
https://github.com/toritori0318/Dockerfiles/blob/master/openresty-split-bench/

結果

10000000回ループでMac上で検証しました。処理時間が短いほど速いです。

項目 処理時間(sec)
ngx_re_split 23.3
lua_split_a 32.8
lua_split_b 49.9
lua_split_c 14.5
lua_split_d 8.91
lua_split_e 29.5


考察

  • ngx_re_split はきちんとメンテされていそうなので品質的には一番安心?OpenRestyで相当なパフォーマンスを要求されない場合はこれで良さそう。また、パターン指定はPCREが利用できるので高機能。
  • Lua 実装は速いもののあるが、実装毎に使い方や仕様が違うので注意(パターン指定方法とか、empty stringの扱いとか)