6

根据https://www.ruby-toolbox.com/categories/JSON_Parsers,我应该在使用 Oj 序列化哈希时获得疯狂的加速。我已经安装了最新的 gem,将它包含在我的 Gemfile 中,运行 bundle install,并且可以确认它正在被使用。如何_知道_在我的 Rails 3 应用程序中哪个 JSON 渲染器处于活动状态?但是,在呈现 JSON 响应方面绝对没有加速。

在一个库中,我使用 Ruby 的 mysql 模块查询一个遗留的 MySQL 数据库。我将字符串转换为值,并返回一个哈希数组。这工作正常,大约需要 1.5 到 2 秒。应该,这里有一大块数据正在被检索。

控制器

@data = Gina.points(params[:project], params[:test],
    session[:username], session[:password])
respond_to do |format|
    format.html { render :text => @data }
    format.json { render :json => @data } # :text => MultiJson.engine
end

图书馆

dbh = Mysql.real_connect(@@host, u, p)
res = dbh.query("SELECT * FROM #{d}.#{t}")
    @data = []
    res.each_hash do |row|
    obj = {}
        row.each_pair do |k, v|
            v.match(/\A[+-]?\d+?(\.\d+)?\Z/) == nil ? obj[k] = v : obj[k] = v.to_f
        end
    @data << obj
end

我的问题是“渲染:json”部分。对于大约 1.5 MB 的数据,这可能需要大约 8 或 9 秒。在较大的数据集(3.5 - 4 MB)上,它可能需要 25 或 30 个。我已经完全使用 JSON 编写了一个字符串和库中的“人工”分隔符,在视图中使用来自 jQuery 的普通 .get , 然后在浏览器中将字符串解析为 JS 中的哈希值。我在较小的集合上减少到 1.4 秒,在较大的集合上减少到 5 秒。

JSON 方法简洁易懂,并且符合设计工作的方式。字符串解析方法是一种肮脏的技巧,我不喜欢它,但它快了六倍。在比较这两种方法时我学到的有趣的事情是,将我的 hacky 字符串“序列化”为 JSON 就像“渲染”文本一样快(因为真的没什么可做的)。这个过程的密集部分实际上是序列化hash,但这正是我希望“更快”的 JSON 库做得更好的事情。

我是从根本上误解了 Oj 应该为我做什么,还是我只是做错了什么?

4

2 回答 2

3

您没有使用 Oj!除非您明确调用它,否则它不会自动生效。将您的原始 JSON 渲染替换为

Oj.dump(args)
于 2012-10-27T07:18:07.110 回答
2

正如这篇博文所指出的,Rails 强制 json 编码方法to_json使用自己的编码实现。这会影响基类,例如 Array、Hash 和 Integer。

这意味着在 json 编码期间,默认情况下根本不使用 multi_json 和 oj,这就是为什么你觉得它很慢。

正如@yujingz 指出的那样,您可以手动使用 Oj 进行编码。

作为替代方案,我使用博客文章创建补丁 gem来使用 MultiJson,它应该自动使用 Oj 进行编码。

于 2013-12-03T03:05:46.543 回答