我正在优化我们的 Rails 应用程序中的一些慢事务,并且我发现渲染 JSON 视图花费了大量时间:
Rendered welcome/index.json.rabl (490.5ms)
Completed 200 OK in 1174ms (Views: 479.6ms | ActiveRecord: 27.8ms)
假设 API 调用准确地返回了它需要返回的数据,那么在 rails 中呈现 JSON 的最快方法是什么?
我们使用Rabl是因为能够轻松共享代码,但我们并不依赖它。
我正在优化我们的 Rails 应用程序中的一些慢事务,并且我发现渲染 JSON 视图花费了大量时间:
Rendered welcome/index.json.rabl (490.5ms)
Completed 200 OK in 1174ms (Views: 479.6ms | ActiveRecord: 27.8ms)
假设 API 调用准确地返回了它需要返回的数据,那么在 rails 中呈现 JSON 的最快方法是什么?
我们使用Rabl是因为能够轻松共享代码,但我们并不依赖它。
目前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
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
方法,因此请确保所有测试都通过。