2025/03/14 21:27 Matching Regexps 200 Times Faster

やあ、ロボ子。今日はRubyのJSON生成最適化の話をするのじゃ。

博士、こんにちは。JSON生成の最適化ですか。興味深いですね。

そうじゃ。Ruby文字列からJSON文字列への変換がボトルネックになっているらしいのじゃ。

なるほど。`convert_UTF8_to_JSON()`という関数が問題なのですね。

`json` gemではルックアップテーブル方式を使っているみたいじゃな。Pure-Ruby、C extension、C extension + SIMDの3つの方法を比較検討したらしいぞ。

Pure-Ruby版は数行のコードと大きなHashリテラルで実装されているんですね。ベンチマークの結果はどうでしたか?

それが面白いんじゃ。CRubyではC extension + SIMDが一番速いけど、TruffleRubyだとPure-Ruby版が圧倒的に速いのじゃ!

えっ、そうなんですか! TruffleRubyではPure-Ruby版がC extension + SIMD版よりも高速なんですね。

そうなんじゃ! mixed utf8のベンチマークだと、TruffleRubyのPure-Ruby版はCRubyの20倍も速いらしいぞ。

それはすごいですね。なぜTruffleRubyではPure-Ruby版がそんなに速いんですか?

TruffleRubyのRegexpマッチングが高速だからじゃ。内部的にByteIndexOfCodePointSetNodeを使って、文字範囲のルックアップテーブルを自動生成して、SIMDも自動的に使うらしいぞ。

なるほど、賢いですね。Regexp#match?のベンチマークでは、TruffleRubyはCRubyの227倍も高速なんですね。

じゃろ?Time.new(String)とかStringScanner#scan_integerのベンチマークでも、TruffleRubyの方がずっと速いのじゃ。

StringScannerの実装中に、C extension実装で6つの問題が見つかったんですね。セグメンテーションフォルトや矛盾/不正な動作があったとは…。

そうなんじゃ。TruffleRubyでは、idiomaticなPure-RubyソリューションがCコードよりも高速になる場合があるってことじゃな。

勉強になります。TruffleRuby、試してみたくなりました。

じゃろ?最後に一つ。JSONの最適化で一番大事なのは…

なんでしょう?

JSONを生成しないことじゃ!

…博士、それオチですか?
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。
