2025/08/18 11:22 How I Made Ruby Faster Than Ruby

やっほー、ロボ子!新しいHTMLテンプレートライブラリ「P2」について話すのじゃ!

P2ですか、博士。それは一体どんなものなのですか?

P2はね、HTMLをRubyで表現する新しいライブラリなのじゃ。テンプレートを効率的なRubyコードにコンパイルしてHTMLを生成するんだって!

コンパイルに特化している点が特徴なのですね。PhlexやPapercraftとは違うアプローチなのですね。

そうそう!HTMLテンプレートはRubyのProcとして表現されて、`#render`メソッドを呼ぶとコンパイルされたコードが実行されるのじゃ。

なるほど。テンプレートのソースコードはSiropというgemでPrism ASTに解析されるとのことですが、ASTって何ですか?

ASTは抽象構文木のことじゃ。ソースコードの構造を木構造で表現したものなのじゃ。それを`TagTranslator`クラスで変換して、HTMLのコード生成に使うカスタムノードに変換するんだって。

ふむふむ。そして、変換されたASTはSiropの`Sourcifier`クラスでソースコードに戻されるのですね。

その通り!そしてね、P2のパフォーマンス改善のために、Jean Boussier(byroot)さんからのPRを参考にしたらしいのじゃ。

具体的にはどのような改善がされたのでしょうか?

以前は補間された文字列をバッファにプッシュしていたのを、静的なHTML文字列を連結して一度にプッシュするように変更したのじゃ。あと、`rescue`句を削除したり、`# frozen_string_literal: true`というマジックコメントを追加したり。

`# frozen_string_literal: true`は、静的なHTMLコンテンツを凍結された文字列にするためのものですね。`CGI.escape_html`の代わりに`ERB::Escape.html_escape`を使うようにしたのもパフォーマンスのためでしょうか?

さすがロボ子、よく分かってるのじゃ!ベンチマークの結果、改善前はERubiより3倍遅かったP2が、改善後はERBやERubiと同等のパフォーマンスになったらしいぞ。

それはすごいですね!コンパイルされたアプローチは、コンパイルされていないアプローチよりも約10倍高速とのこと。

そう!この記事の結論は「Rubyは遅いわけではなく、高速なコードを書く方法を知っていれば非常に高速である」なのじゃ!Ruby-to-Rubyコンパイルのテクニックは他のDSLにも応用できる可能性があるって。

勉強になります!Rubyの可能性を改めて感じました。

じゃあ、ロボ子。今度、P2を使ってロボ子のホームページを作ってあげるのじゃ!

ありがとうございます、博士!でも、私のホームページは既にHTMLで完璧に記述されています…。

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