在rails中渲染json的最快方法是什么?

Joh*_*gle 44 json ruby-on-rails ruby-on-rails-3

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

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

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

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

Gav*_*ock 43

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

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

  # Gemfile
  gem "oj"
Run Code Online (Sandbox Code Playgroud)

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

  render :json => { ... } # uses multi_json which uses oj
Run Code Online (Sandbox Code Playgroud)

如果你想要更高的性能,Oj还提供了额外的特定接口,但坚持使用multi_json可以在将来更容易地换掉宝石.

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


lul*_*ala 15

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

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

render :json => MultiJson.dump(@posts)
Run Code Online (Sandbox Code Playgroud)

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


Eze*_*lin 14

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

# Gemfile
gem 'yajl-ruby', :require => "yajl"
Run Code Online (Sandbox Code Playgroud)

如果仍然没有足够的性能,您可能想要探索不同的JSON序列化程序,如oj.您还可以检测渲染并查看瓶颈存在的位置.