RubyKaigi登壇しますSlimより高速なHaml実装「Hamlit」RubyでHTMLを生成するのにERB以外でよく使われるテンプレート言語にHamlやSlimがあります。やめて高速なslimに移行する人が多かったのですが、私はHamlのシンタックスの方が好きなので、slimが用意したベンチマークでslimより高速なHaml実装「Hamlit」を3月にリリースしました。*3、FamlとHamlitを追加したベンチマークの結果です。Hamlitは完全にHaml互換の仕様ではなく、この非互換が有利に働いています。v2.0Hamlitの互換性の問題Hamlitは最初のv0.1の時点で上記のようなベンチでSlimより高速ではあったのですが、以下のような欠陥がありました。ランタイムで出ても行番号がズレるコーナーケースで属性のレンダリングが重複したり、消えたりする最適化の影響で、書き方が静的か動的かでHTMLのレンダリング結果が変わってしまう空白除去オペレータの挙動がおかしい社内の20,000個以上のテストケースがあるRailsアプリで使ってみたら5,000個くらいのテストが落ちる状態でした。v1.0.0をリリースしました。v1のどこかのバージョンでそのアプリの全てのテストが通っています。v2.0をリリースしました。一つのHaml実装「Faml」との戦いHamlitより先にリリースされたhamlより高速なHaml実装としてFamlがあります。slimが提供しているベンチマーク(をFamlが公平に参加できるようにしたもの)ではHamlitの非互換性が有利に働きHamlitの方が高速に動作しますが、その他の多くのベンチマークではC拡張を持っているFamlの方が高速に動作する状態でした。Famlが恣意的に用意したベンチマークでは、1.35倍程度Hamlitの方が遅い状態でした。C言語レベルでの最適化を行い、上記のような動的なテンプレートでも以下のようにHamlitの方が高速に動作するようになりました。slowerでも昨日FamlがC++になって速くなってるので、明日には抜かれているかもしれません。静的解析エンジンFamlはRubyの式が静的であればコンパイル時にレンダリング結果を確定させる機構を持っているのですが、Hamlitのそれはかなり貧弱のため、そういったケースでもレンダリング速度で劣っていました。速度が出るようになりました。slowerコンパイル速度の問題これまで出てきたのは全てレンダリング速度に関するベンチマークですが、本来はコンパイル速度も全体のパフォーマンスに影響し得ます。Webサービスではあるテンプレートのコンパイル回数に比べてレンダリング回数の方がかなり多くなるためコンパイル速度は無視できますが、Hamlitはコンパイルが非常に遅く、レンダリング回数がそれほど多くないタスクで使うには必ずしもHamlitをオススメできない状態でした。これはhamlのリポジトリにあるstandard.hamlという少し大きめのテンプレートですが、コンパイル速度でFamlに勝てるようになりました。コンパイル時に最適化をあまり行わないhamlにはまだ勝てていません。さんと一緒に登壇します。一つの枠で二人のアイデアが聞けるのでお得です。速くしたのかの詳細はあえてこの記事では書きませんでしたが、何を考えて作ったのかとかも含めRubyKaigiで話す予定です。escapeされるように直してる。escapeしないオプションがないのと、Railsの標準だとescapeされるため。月別アーカイブ検索はてなブログをはじめよう!k0kubunさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。