escape_utilsは速かった
webアプリを作る上で、xssを防ぐためにもhtmlのエスケープ処理は必ずやらなければなりません。
この処理は何度も何度もコールされるので、ここの速度を上げることができたらレスポンスタイムの向上に寄与しそうです。
Railsのhtmlエスケープ処理は正規表現を使ったString#gsubで行われていて、これはいかにも遅そう。文字列処理といえば、ぼくが以前作った word_scoopというライブラリがあります。キーワードを検出するライブラリとしてはかなりの速度を誇っていると自負しています。
このコードを流用すれば、escape処理も速くできるんじゃないかと思って試しに実装してみました。
https://github.com/tsukasaoishi/saisoku
高速なescape処理のライブラリとしては escape_utilsが有名だと思います。これに備えられているbenchmarkを使って、スピード勝負をしてみました。
user system total real
Rack::Utils.escape_html 0.700000 0.010000 0.710000 ( 0.703861)
Haml::Helpers.html_escape 0.410000 0.000000 0.410000 ( 0.406808)
ERB::Util.html_escape 0.410000 0.000000 0.410000 ( 0.406936)
CGI.escapeHTML 0.400000 0.000000 0.400000 ( 0.398324)
String#gsub 0.410000 0.000000 0.410000 ( 0.404282)
fast_xs_extra#fast_xs_html 0.040000 0.000000 0.040000 ( 0.042459)
EscapeUtils.escape_html 0.040000 0.000000 0.040000 ( 0.038627)
Saisoku::HtmlEscape.escape 0.090000 0.000000 0.090000 ( 0.090283) # これが作ったライブラリ
結果は見事に完敗でした。ERBのescapeよりは4倍ほど速くできましたが、escape_utilsよりは3倍近く遅いです。思いつきでぱっと作って最速の座が取れるほど甘くはありません。
みなさん、escape_utilsを使いましょう。