トップ «前の日記(2024/12/17 (火) ) 最新 次の日記(2024/12/19 (木) )» 編集 RSS feed

HsbtDiary


2024/12/18 (水) [長年日記]

Ruby 3.4 の JSON は速くなった

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 として公開されたので興味ある人はこちらもどうぞ。

NEWS.md に Ruby 3.4 に含まれる予定の gem のアップデート履歴を表示するようにした

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 バージョンであるとか、過去のバージョンのメンテナンスリリースを弾くとか。

とりあえずこの状態で出そうとは思うので、役にたった、とか後でコメントを貰えると喜びます。