おおいしつかさ


旅行とバイクとドライブと料理と宇宙が好き。
Ubie Discoveryのプログラマ。
Share:  このエントリーをはてなブックマークに追加

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を使いましょう。