在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通过。