在rails中渲染json的最快方法是什么?
我正在优化我们的Rails应用程序中的一些慢事务,并且我看到了显着的JSON视图渲染时间:
Rendered welcome/index.json.rabl (490.5ms) Completed 200 OK in 1174ms (Views: 479.6ms | ActiveRecord: 27.8ms)
假设API调用正在返回它需要返回的数据, 在轨中呈现JSON的最快方法是什么?
我们正在使用Rabl,因为它能够轻松地共享代码,但是我们并没有把它绑在上面。
multi_json
使用multi_json
来跨平台兼容,默认情况下不会使用相当快速的Yajl库。 Rabl的configuration文档解释了解决scheme:
# Gemfile gem 'yajl-ruby', :require => "yajl"
如果仍然不够高性能,您可能想要探索一个不同的JSON序列化程序,如oj 。 你也可以testing你的渲染,看看瓶颈的存在。
目前oj似乎是最快的渲染器 – 击败yajl(根据oj作者的比较 )。
在最新的multi_json中默认使用Oj(默认情况下,rails使用mutli_json),所以交换到oj应该像将以下内容添加到Gemfile一样简单:
# Gemfile gem "oj"
然后每次调用渲染,它现在将使用oj。
render :json => { ... } # uses multi_json which uses oj
Oj还提供了额外的特定接口,如果你想要更多的性能,但坚持multi_json使得将来更换gem更容易。
请注意,如果您有任何{ ... }.to_json
调用 – 除非在初始化程序中调用Oj.mimic_JSON
,否则这些调用不会升级为使用oj。
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
方法,所以确保所有的testing通过。