Rails の to_json を 13 倍速くする方法
http://shugo.net/jit/20060715.html
先日、ちょっとした Rails アプリを作っていたのですが、JSON で出力する部分がやたらと遅くて困ってました。で、軽く調べてみたら ActiveSupport の String#to_json がやたらと重い!そういえば前田さんも遅い云ってたよな、と思って上記 URL で書いてある String#to_json に変更したところ、なんと約 13 倍も速くなるという驚きの結果に!!!
というわけで、Rails で JSON な API を提供している人は割と上記 String#to_json の変更が必須かと。本家にとりこまれないかなー。
あとベンチマークはこんな感じで。Benchmark::Runner は自作のを使ってます。
#!/usr/bin/env ruby require 'benchmark/runner' require 'open-uri' require 'rubygems' require 'active_support' class String JSON_ESCAPED = { "\010" => '\b', "\f" => '\f', "\n" => '\n', "\r" => '\r', "\t" => '\t', '"' => '\"', '\\' => '\\\\' } def fast_to_json return '"' + gsub(/[\010\f\n\r\t"\\]/) { |s| JSON_ESCAPED[s] }.gsub(/([\xC0-\xDF][\x80-\xBF]| [\xE0-\xEF][\x80-\xBF]{2}| [\xF0-\xF7][\x80-\xBF]{3})+/ux) { |s| s.unpack("U*").pack("n*").unpack("H*")[0].gsub(/.{4}/, '\\\\u\&') } + '"' end end class JsonBench < Benchmark::Runner def setup @source = open('http://www.hatena.ne.jp/').read end def activesupport_to_json @source.to_json end def fast_to_json @source.fast_to_json end end JsonBench.run(5)
結果
user system total real fast_to_json 0.010000 0.230000 0.240000 ( 0.242278) activesupport_to_json 0.340000 2.910000 3.250000 ( 3.255585)
ライド・オン・Rails Ruby on Railsを徹底攻略
posted with amazlet on 06.08.12
吉田 和弘 馬場 道明
ソフトバンククリエイティブ (2006/06/30)
ソフトバンククリエイティブ (2006/06/30)