我正在优化我们的Rails应用程序中的一些慢速事务,并且我看到了渲染JSON视图所花费的大量时间:
Rendered welcome/index.json.rabl (490.5ms)
Completed 200 OK in 1174ms (Views: 479.6ms | ActiveRecord: 27.8ms)
假设API调用正在返回它需要返回的数据,在rails中呈现JSON的最快方法是什么?
我们正在使用Rabl因为能够轻松共享代码,但我们并不依赖它。
答案 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倍。 Announcement。 Code。你需要创建一个新的Serializer来利用它,但是对于那些受到影响的人来说,这似乎不是一个很大的障碍。