46

我正在优化我们的 Rails 应用程序中的一些慢事务,并且我发现渲染 JSON 视图花费了大量时间:

Rendered welcome/index.json.rabl (490.5ms)
Completed 200 OK in 1174ms (Views: 479.6ms | ActiveRecord: 27.8ms)

假设 API 调用准确地返回了它需要返回的数据,那么在 rails 中呈现 JSON 的最快方法是什么?

我们使用Rabl是因为能够轻松共享代码,但我们并不依赖它。

4

4 回答 4

46

目前oj似乎是最快的渲染器——击败 yajl(根据 oj 作者的比较)。

在最新的 multi_json 中默认使用 oj(并且 rails 默认使用 mutli_json),因此切换到 oj 应该像在 Gemfile 中添加以下内容一样简单:

  # Gemfile
  gem "oj"

然后每次调用render,它现在都会使用oj。

  render :json => { ... } # uses multi_json which uses oj

如果您想要更高的性能,Oj 还提供了额外的特定接口,但坚持使用 multi_json 可以更轻松地在将来更换 gem。

请注意,如果您有任何调用 - 除非您调用初始化程序,{ ... }.to_json否则这些不会升级为使用 oj 。Oj.mimic_JSON

于 2012-05-09T04:01:15.367 回答
16

Rails 3 使用 multi_json,但它只用于json 解码,而不是编码。Json 编码/渲染/生成使用 ActiveSupport JSON 库的to_json方法,因此总是很慢(即使您使用 Oj gem)。

您可以通过执行以下操作显式使用 multi_json 进行渲染:

render :json => MultiJson.dump(@posts)

或者您可以尝试rails-patch-json-encode gem(由我),默认情况下将使用 multi_json。它将影响所有内置to_json方法,因此请确保所有测试都通过。

于 2013-10-07T07:37:05.250 回答
14

Rablmulti_json用于跨平台兼容,默认情况下不使用相当快的 Yajl 库。Rabl 的配置文档解释了解决方案:

# Gemfile
gem 'yajl-ruby', :require => "yajl"

如果仍然不够高效,您可能需要探索不同的 JSON 序列化程序,例如oj。您还可以检测您的渲染并查看瓶颈所在的位置。

于 2012-05-04T15:36:37.500 回答
0

Netflix 最近发布了一个新的 JSON 渲染库,据说比默认库快 25-40 倍。公告代码。您需要创建一个新的序列化程序来利用它,但对于受影响的人来说,这似乎不是一个大障碍。

于 2018-04-12T18:17:40.640 回答