Ruby 3.4 の変更点をチェックしている時に byroot がめっちゃパフォーマンスよくしたからリリースアナウンスでも触れておかないと、と思いどれくらい速くなったかベンチマークとってみたら Ruby 3.3 に添付されている 2.7.2 と比較して 1.5 倍くらい速くなっていた。
Ruby 3.3 についている json-2.7.2 で日本語も含む twitter.json
をパースしたときの結果
== Parsing twitter.json (567916 bytes)
Warming up --------------------------------------
json 41.000 i/100ms
oj 51.000 i/100ms
Oj::Parser 62.000 i/100ms
Calculating -------------------------------------
json 427.137 (± 1.9%) i/s (2.34 ms/i) - 2.173k in 5.089185s
oj 518.017 (± 1.7%) i/s (1.93 ms/i) - 2.601k in 5.022639s
Oj::Parser 639.166 (± 1.1%) i/s (1.56 ms/i) - 3.224k in 5.044651s
Comparison:
json: 427.1 i/s
Oj::Parser: 639.2 i/s - 1.50x faster
oj: 518.0 i/s - 1.21x faster
上記だと、oj の方が 1.2-1.5 倍速い。そして Ruby 3.4 に添付される予定の json-2.9.0 だと以下のような結果。
== Parsing twitter.json (567916 bytes)
Warming up --------------------------------------
json 73.000 i/100ms
oj 50.000 i/100ms
Oj::Parser 62.000 i/100ms
Calculating -------------------------------------
json 712.859 (± 5.8%) i/s (1.40 ms/i) - 3.577k in 5.037423s
oj 473.648 (± 6.5%) i/s (2.11 ms/i) - 2.400k in 5.090305s
Oj::Parser 559.226 (±12.2%) i/s (1.79 ms/i) - 2.790k in 5.078324s
Comparison:
json: 712.9 i/s
Oj::Parser: 559.2 i/s - 1.27x slower
oj: 473.6 i/s - 1.51x slower
今度は oj の方が 1.2-1.5倍遅い、ちゃんと同一のプロセスで試行したほうが良いのだろうけど、JSON は C 拡張なので同時に異なるバージョンをテストはできないのだった。とはいえ Ruby 3.4 の JSON は oj よりも速いし、Ruby 3.3 に添付されているバージョンよりも速くなったという結論で良いと思います。
byroot 本人による、パフォーマンスチューニングの解説が https://byroot.github.io/ruby/json/2024/12/15/optimizing-ruby-json-part-1.html として公開されたので興味ある人はこちらもどうぞ。
Ruby 3.4 のリリースにむけて NEWS.md には csv が x.y.z になった、ということは今まで書いていたけど、それを見てもユーザーにとっては「で、何が変わったの?」は全くわからないし、github の ruby/csv
に行って changelog なり releases を見て把握する、という必要があった。これはだるいよなあと自分でも思うので、Ruby 3.3 から 3.4 までの変更点すべてを github releases があるものは全部リンクとしてつけるようにした。
生成は流石に手作業ではやってられないので Ruby でコードを書いてしまったが、tag のルールが vX.Y.Z
だったり、X.Y.Z
だったり、何なら bundler-X.Y.Z
だったりとカオスすぎるので結構大変だった。あとは pre バージョンであるとか、過去のバージョンのメンテナンスリリースを弾くとか。
とりあえずこの状態で出そうとは思うので、役にたった、とか後でコメントを貰えると喜びます。