Ruby のベンチマークテストツール benchmark_driver のバージョンが 0.16.0 に上がった。
新機能の一つは,ワンライナーでの実行(「インライン Ruby スクリプトのベンチマーキング」)。
短いスクリプトならいちいちファイルを作らなくてもベンチマークテストができる。
ではこれを使って,CGI.escapeHTML
による HTML エスケープを以下の Ruby バージョンで比較してみよう。
- Ruby 3.1.2
- Ruby 3.2.0-preview2
- Ruby 3.2.0-preview2(YJIT)
rbenv で Ruby をインストールしている場合は,--rbenv
オプションによって複数の Ruby での比較ができる。オプションの値は以下のように書く。
3.1.2;3.2.0-preview2;3.2.0-preview2 --yjit
つまり,複数の Ruby バージョンを ;
で区切る。YJIT を使う場合はスペースを挟んで --yjit
を付ける。
実行するスクリプトは
require'cgi';CGI.escapeHTML('F&B<GB>B')
だ。
全体としては以下のように書く。スクリプトも --rbenv
の値も " "
で囲む。
benchmark-driver "require'cgi';CGI.escapeHTML('F&B<GB>B')" --rbenv "3.1.2;3.2.0-preview2;3.2.0-preview2 --yjit"
結果は以下のとおり。
require'cgi';CGI.escapeHTML('F&B<GB>B')
3.2.0-preview2 --yjit: 1466638.7 i/s
3.2.0-preview2: 1098110.5 i/s - 1.34x slower
3.1.2: 46608.3 i/s - 31.47x slower
えっ,ちょっ,ナニコレ? Ruby 3.2 速過ぎないか? マジかよ,何があった?
年末にリリースされるであろう Ruby 3.2.0 正式版が preview2 の速度を維持するかどうかは分からないが,ともかく Ruby 3.1.2 → 3.2.0-preview2 で 20 倍速以上になっている。
YJIT を使うとさらに 30% 以上も速くなっている。
ええ〜っ?
いや,まあ,他にいくつか試したコードでは Ruby 3.2.0 は全然速くなってないので,CGI.escapeHTML
が特殊なケースなのだろうと思う。
うーん,それにしても CGI.escapeHTML
はこれまでも 高速化を繰り返してきた のに,まだ大幅な高速化の余地があったのかね。
これが何か私の勘違いとかではなく正夢であることを祈る。