jbuilderは、データを含む大きなハッシュを構築し、それを使用ActiveSupport::JSON
してjsonに変換します。次のマイクロベンチマークが示すように、より高速なjsonエミッターがあります(multijsonおよびyajl-ruby gemがインストールされていることを確認してください)
require 'benchmark'
require 'active_support'
require 'multi_json'
sample = {menu: {
header: "SVG Viewer",
items: [
{id: "Open"},
{id: "OpenNew", label: "Open New"},
nil,
{id: "ZoomIn", label: "Zoom In"},
{id: "ZoomOut", label: "Zoom Out"},
{id: "OriginalView", label: "Original View"},
nil,
{id: "Quality"},
{id: "Pause"},
{id: "Mute"},
nil,
{id: "Find", label: "Find..."},
{id: "FindAgain", label: "Find Again"},
{id: "Copy"},
{id: "CopyAgain", label: "Copy Again"},
{id: "CopySVG", label: "Copy SVG"},
{id: "ViewSVG", label: "View SVG"},
{id: "ViewSource", label: "View Source"},
{id: "SaveAs", label: "Save As"},
nil,
{id: "Help"},
{id: "About", label: "About Adobe CVG Viewer..."}
]
}}
MultiJson.engine = :yajl
Benchmark.bmbm(5) do |x|
x.report 'activesupport' do
1000.times {ActiveSupport::JSON.encode(sample)}
end
x.report 'yajl' do
1000.times {MultiJson.encode(sample)}
end
end
私のマシンでは、これは
user system total real
activesupport 1.050000 0.010000 1.060000 ( 1.068426)
yajl 0.020000 0.000000 0.020000 ( 0.021169)
つまり、サンプルオブジェクトを1000回エンコードするには、アクティブなサポートに1秒以上かかり、MultiJson(yajlエンジンを使用)には21ミリ秒かかりました。
JBuilderはActiveSupport::JSONを使用するようにハードコーディングされていますが、MultiJSON(jsonライブラリを切り替えることができるgem)は簡単なドロップインであり、すでにActiveSupportに依存しています-jbuilderの私のフォークを参照してください。プルリクエストを開きましたが、それまではこのフォークを使用してみてください(または独自のフォークを作成してください-これは1行の変更です)