Ruby on Railsの超高速JSON

Railsでは、結果をJSONで出力するのは非常に簡単です。



render json: @statuses
      
      





少数のレコードを印刷する必要がある場合、これは正常に機能します。 しかし、10,000件のレコードをすぐに印刷する必要がある場合はどうなりますか? パフォーマンスは大幅に低下し、最も時間がかかるのはJSONシリアル化とデータベース操作です。







必須属性のみを含める



最初の明らかな解決策は、必要な属性のみでJSONを生成することです。



 render json: @statuses, methods: [:latitude, :longitude, :timestamp, :virtual_odometer]
      
      





フィルター処理されたJSONにより、パフォーマンスが20%以上向上します。



 default 5.940000 0.080000 6.020000 ( 6.094221) attrs 4.820000 0.010000 4.830000 ( 4.932337)
      
      







必須フィールドのみを選択してください



2番目の解決策は、データベースからすべてを取得するのではなく、必要なフィールドのみを取得することです。



 render json: @statuses.select([:latitude, :longitude, :timestamp, :virtual_odometer])
      
      





これにより、データベースからアプリケーションに大量の余分なデータが転送されることを回避し、2倍の速度向上を実現できます。



 default 5.940000 0.080000 6.020000 ( 6.094221) attrs 4.820000 0.010000 4.830000 ( 4.932337) select 2.170000 0.020000 2.190000 ( 2.222277)
      
      







可能であれば、ActiveRecordオブジェクトを初期化しないでください。



ActiveRecordオブジェクトの代わりに「超高速」ハッシュ配列を返すメソッドを実装しましょう:



 def self.lightning connection.select_all(select([:latitude, :longitude, :timestamp, :virtual_odometer]).arel).each do |attrs| attrs.each_key do |attr| attrs[attr] = type_cast_attribute(attr, attrs) end end end
      
      





これはpluckメソッドと同じように機能しますが、1つのフィールドの値の配列ではなく、ハッシュの配列を返します。 コントローラーで新しいメソッドを呼び出します。



 render json: @statuses.lightning
      
      





軽量ハッシュを使用すると、JSONの作成がさらに2倍速くなります。



 default 5.940000 0.080000 6.020000 ( 6.094221) attrs 4.820000 0.010000 4.830000 ( 4.932337) select 2.170000 0.020000 2.190000 ( 2.222277) lightning 1.120000 0.010000 1.130000 ( 1.148763)
      
      







最速のJSONダンパーを使用する



現在、いくつかのJSONライブラリが利用可能です:



最速のものを使用することをお勧めします。



 json 0.810000 0.020000 0.830000 ( 0.841307) yajl 0.760000 0.020000 0.780000 ( 0.809903) oj 0.640000 0.010000 0.650000 ( 0.666230)
      
      





そこで、Ojダンパーを選択します。



 render json: Oj.dump(@statuses.lightning, mode: :compat)
      
      





一般化されたテスト結果:



  user system total real default 5.940000 0.080000 6.020000 ( 6.094221) attrs 4.820000 0.010000 4.830000 ( 4.932337) select 2.170000 0.020000 2.190000 ( 2.222277) lightning 1.120000 0.010000 1.130000 ( 1.148763) json 0.810000 0.020000 0.830000 ( 0.841307) yajl 0.760000 0.020000 0.780000 ( 0.809903) oj 0.640000 0.010000 0.650000 ( 0.666230)
      
      






All Articles