Rails=アプリケーションで遅いトランザクションを最適化していますが、JSONビューのレンダリングにかなりの時間がかかっています:
Rendered welcome/index.json.rabl (490.5ms)
Completed 200 OK in 1174ms (Views: 479.6ms | ActiveRecord: 27.8ms)
API呼び出しが返す必要のあるデータを正確に返していると仮定すると、JSONをRailsでレンダリングする最も速い方法は何ですか?
Rabl を使用しているのは、コードを簡単に共有できるためです。しかし、それには縛られていません。
Rablはプラットフォーム間の互換性のためにmulti_json
を使用し、デフォルトでは非常に高速なYajlライブラリを使用しません。 Rablの config documentation はソリューションを説明しています:
# Gemfile
gem 'yajl-Ruby', :require => "yajl"
それでも十分なパフォーマンスが得られない場合は、 oj のような別のJSONシリアライザーを調べてください。 instrument レンダリングして、ボトルネックが存在する場所を確認できます。
現在、 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に固執することで、将来的に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)
または、デフォルトでmulti_jsonを使用する Rails-patch-json-encode gem (by me)を試すこともできます。すべてのビルドインto_json
メソッドに影響するため、すべてのテストに合格するようにしてください。