我正在开发的应用程序使用
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 end0 ( 1.068426)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
yajl 0.020000 0.000000 0.020000 ( 0.021169)