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

标签 ruby-on-rails-3 json performance rendering

我正在使用的应用使用JSON对象或其集合响应大多数请求。我们正在使用Jbuilder构建这些响应。呈现的数据量非常大(各种嵌套结构中的数千个对象-格式化并完全扩展后,典型响应最多可以包含10,000行JSON)。根据NewRelic的说法,这种渲染花费了大量时间-约占总请求时间的1/3。

我正在寻找某种指南,技巧或其他资源,它们将帮助我确保从JBuilder获得最佳性能。我也很好奇Jbuilder与RABL或其他类似工具是否存在性能比较。

编辑:我发现一个GitHub Issue提示Jbuilder的性能,但任何人的唯一实际建议是“不要使用Jbuilder”。好吧,实际上,他们使用的语言稍​​强一些,但是对于为什么Jbuilder如此之慢,如何解决(如果有的话)如何解决它,或者其他用于完成同一任务的工具的比较,仍然一无所知。

最佳答案

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引擎)花费了21ms。

JBuilder硬编码为使用ActiveSupport::JSON,但是MultiJSON(可让您在json库之间进行切换的 gem )是一个很简单的插件,并且已经是ActiveSupport的依赖项-请参阅我的fork of jbuilder。我已经打开了请求请求,但是直到那时您都可以尝试使用此fork(或创建自己的fork-这是一行更改)

关于ruby-on-rails-3 - 使用Jbuilder和Rails 3提高渲染性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10983424/

相关文章:

ruby-on-rails - 简化和正确的 RSpec Controller 测试

jquery - 从 Controller 获取标记以使用 gmaps4rails 刷新 map

ruby - Rails 命令在 ANSICON 安装后不起作用

mysql - 查询执行涉及的步骤

mysql - Rails 3 和 MySQL 的问题与 ActiveSupport 中的 JSON 依赖相关

javascript - 语法错误: Unexpected token "[ " in JSON - Javascript

json - 解码 JSON Swift 4 - 嵌套对象/数组

php - 使用 PHP 生成包含大量行的 JSON

python - 如何提高 python opencv 的性能?

performance - 使用 Data.ByteString 实现 unix 的 "cat"程序的 Haskell 性能