我正在优化我们的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 似乎是最快的渲染器 - 根据 oj 作者的 comparison。
最新的 multi_json 默认使用 Oj(Rails 默认使用 mutli_json),因此切换到 Oj 应该很简单,只需将以下内容添加到您的 Gemfile 中即可:
# Gemfile
gem "oj"
render :json => { ... } # uses multi_json which uses oj
Oj还提供了其他特定的接口,如果您想获得更高的性能,但使用multi_json可以更容易地替换宝石。
请注意,如果您有任何{ ... }.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
方法,所以请确保所有测试都通过。
MultiJson::dump
非常快!感谢提到这点。 - sixty4bit