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

时间:2012-05-04 15:23:31

标签: ruby-on-rails ruby-on-rails-3 json

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

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

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

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

4 个答案:

答案 0 :(得分:43)

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

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

  # Gemfile
  gem "oj"

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

  render :json => { ... } # uses multi_json which uses oj

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

请注意,如果您有{ ... }.to_json次来电,除非您在初始化程序中调用Oj.mimic_JSON,否则这些调用不会升级为使用oj。

答案 1 :(得分:15)

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方法,因此请确保所有测试都通过。

答案 2 :(得分:14)

Rabl使用multi_json来实现跨平台的兼容性,默认情况下不使用相当快的Yajl库。 Rabl的config documentation解释了解决方案:

# Gemfile
gem 'yajl-ruby', :require => "yajl"

如果仍然没有足够的性能,您可能希望探索不同的JSON序列化程序,如oj。您可以also instrument渲染并查看瓶颈存在的位置。

答案 3 :(得分:1)

Netflix最近发布了一个新的JSON渲染库,据称比默认库快25-40倍。 AnnouncementCode。你需要创建一个新的Serializer来利用它,但是对于那些受到影响的人来说,这似乎不是一个很大的障碍。