ruby-on-rails-3 – 使用Jbuilder和Rails提高渲染性能3

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

我正在寻找一些指导,一组提示或其他资源,这将有助于我确保从JBuilder获得最佳性能.如果Jbuilder与RABL或其他类似工具有性能比较,我也很好奇.

编辑:我发现一个GitHub Issue抱怨Jbuilder的表现,但任何人所做的唯一实际建议是’不要使用Jbuilder’.那么实际上他们使用的语言比较强一点,但是Jbuilder为什么这么慢呢,还有什么可以做的,或者同样的任务的其他工具如何比较呢?

解决方法

jbuilder构建一个包含数据的大哈希值,然后使用ActiveSupport :: JSON将其转换为json.有更快的json发射器作为以下微基准显示(确保你已经安装了多个json和yajl-ruby宝石)
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"},{id: "Quality"},{id: "Pause"},{id: "Mute"},{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"},{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

在我的机器上生产

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

JBuilder是硬编码使用ActiveSupport :: JSON,但是MultiJSON(一个可以让您在json库之间切换的gem)是一个微不足道的下降,并且已经是ActiveSupport的依赖 – 请参阅我的fork of jbuilder.我打开了一个拉请求,但直到那么你可以尝试使用这个叉子(或创建自己的 – 这是一个一行的更改)

user system total real activesupport 1.050000 0.010000 1.
require 'benchmark'
require 'active_support'
require 'multi_json'
sample = {menu: {
    header: "SVG Viewer",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
require 'benchmark' require 'active_support' require 'multi_json' sample = {menu: { header: "SVG Viewer",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 end0 ( 1.068426)
yajl 0.020000 0.000000 0.020000 ( 0.021169)

相关文章

validates:conclusion,:presence=>true,:inclusion=>{...
一、redis集群搭建redis3.0以前,提供了Sentinel工具来监控各...
分享一下我老师大神的人工智能教程。零基础!通俗易懂!风趣...
上一篇博文 ruby传参之引用类型 里边定义了一个方法名 mo...
一编程与编程语言 什么是编程语言? 能够被计算机所识别的表...
Ruby类和对象Ruby是一种完美的面向对象编程语言。面向对象编...