web-dev-qa-db-ja.com

jsonをrailsでレンダリングする最速の方法は何ですか

Rails=アプリケーションで遅いトランザクションを最適化していますが、JSONビューのレンダリングにかなりの時間がかかっています:

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

API呼び出しが返す必要のあるデータを正確に返していると仮定すると、JSONをRailsでレンダリングする最も速い方法は何ですか?

Rabl を使用しているのは、コードを簡単に共有できるためです。しかし、それには縛られていません。

44
John Naegle

Rablはプラットフォーム間の互換性のためにmulti_jsonを使用し、デフォルトでは非常に高速なYajlライブラリを使用しません。 Rablの config documentation はソリューションを説明しています:

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

それでも十分なパフォーマンスが得られない場合は、 oj のような別のJSONシリアライザーを調べてください。 instrument レンダリングして、ボトルネックが存在する場所を確認できます。

14
Ezekiel Templin

現在、 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を使用するようにアップグレードされないことに注意してください。

43
Gavin Brock

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メソッドに影響するため、すべてのテストに合格するようにしてください。

15
lulalala

Netflixは最近、デフォルトのライブラリよりも25〜40倍速いと思われる新しいJSONレンダリングライブラリをリリースしました。 アナウンスメントコード 。それを利用するために新しいシリアライザーを作成する必要がありますが、影響を受ける人々にとって、それは大きなハードルではないようです。

1
David Krider