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(或者创建你自己的 - 它是一行更改)