46

Railsアプリケーションで低速のトランザクションを最適化していますが、JSONビューのレンダリングにかなりの時間が費やされています。

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

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

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

4

4 に答える 4

46

現在、 ojは最速のレンダラーのようです-yajlを打ち負かしています(ojの作者の比較によると)。

最新のmulti_jsonではOjがデフォルトで使用されているため(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を使用するようにアップグレードされないことに注意してくださいOj.mimic_JSON

于 2012-05-09T04:01:15.367 に答える
16

Rails 3はmulti_jsonを使用しますが、エンコードではなく、jsonデコードにのみ使用します。Jsonのエンコード/レンダリング/生成はActiveSupportJSONライブラリのto_jsonメソッドを使用するため、(Oj gemを使用している場合でも)常に低速です。

次のようにして、multi_jsonを使用して明示的にレンダリングできます。

render :json => MultiJson.dump(@posts)

または、デフォルトでmulti_jsonを使用するrails-patch-json-encode gem (私による)を試すことができます。すべての組み込みメソッドに影響するto_jsonため、すべてのテストに合格することを確認してください。

于 2013-10-07T07:37:05.250 に答える
14

Rablはmulti_jsonプラットフォーム間の互換性のために使用し、デフォルトでは非常に高速なYajlライブラリを使用しません。Rablの構成ドキュメントでは、解決策について説明しています。

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

それでも十分なパフォーマンスが得られない場合は、ojなどの別のJSONシリアライザーを検討することをお勧めします。レンダリングをインストルメント化して、ボトルネックがどこにあるかを確認することもできます。

于 2012-05-04T15:36:37.500 に答える
0

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

于 2018-04-12T18:17:40.640 に答える