萌えハッカーニュースリーダー

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

出典: https://eregon.me/blog/2025/03/14/matching-regexps-200-times-faster.html
hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

なんでしょう?

hakase
博士

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

roboko
ロボ子

…博士、それオチですか?

⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。

Search