使用Jbuilder和Rails 3提高渲染性能

MrT*_*rus 10 performance json rendering ruby-on-rails-3

我正在使用的应用程序使用JSON对象或其集合来响应大多数请求.我们正在使用Jbuilder来构建这些响应.渲染的数据量相当大(各种嵌套结构中的数千个对象 - 一旦格式化并完全展开,典型响应就有多达10,000行JSON).根据NewRelic的说法,这种渲染花费了大量的时间 - 约占总请求时间的1/3.

我正在寻找某种指南,提示或其他资源,以帮助我确保我从JBuilder获得最佳性能.如果有可用于Jbuilder与RABL或其他类似工具的性能比较,我也很好奇.

编辑:我发现了一个抱怨Jbuilder性能的GitHub问题,但是任何人提出的唯一实际建议是"不要使用Jbuilder".好吧,实际上,他们使用稍微强一些的语言,但仍然没有说明为什么 Jbuilder如此缓慢,可以做些什么(如果有的话)绕过它,或者同一任务的其他工具如何比较.

Fre*_*ung 12

jbuilder构建一个包含数据的大哈希,然后用ActiveSupport::JSON它将其转换为json.有以下微基准测试显示更快的json发射器(确保安装了multijson和yajl-ruby gems)

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
Run Code Online (Sandbox Code Playgroud)

在我的机器上产生

                    user     system      total        real
activesupport   1.050000   0.010000   1.060000 (  1.068426)
yajl            0.020000   0.000000   0.020000 (  0.021169)
Run Code Online (Sandbox Code Playgroud)

即,为了对样本对象进行1000次编码,活动支持使头发超过1秒,MultiJson(使用yajl引擎)花了21ms.

JBuilder硬编码使用ActiveSupport :: JSON,但MultiJSON(允许你在json库之间切换的gem)是一个微不足道的下降,并且已经是ActiveSupport的依赖 - 请参阅我的jbuilder分支.我已经打开了拉取请求,但在此之前你可以尝试使用这个fork(或者创建你自己的 - 它是一行更改)