render json: @statuses
少数のレコードを印刷する必要がある場合、これは正常に機能します。 しかし、10,000件のレコードをすぐに印刷する必要がある場合はどうなりますか? パフォーマンスは大幅に低下し、最も時間がかかるのはJSONシリアル化とデータベース操作です。
![](https://habrastorage.org/storage2/818/b9f/047/818b9f04766632a87ea6f0755faeeec1.jpg)
必須属性のみを含める
最初の明らかな解決策は、必要な属性のみで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-デフォルトでgem JSON(+ C拡張機能、Ruby 1.9に付属)
- Yajl-もう1つのJSONライブラリ(著者Brian Lopez)
- Oj-最適化されたJSON(著者Peter Ohler)
最速のものを使用することをお勧めします。
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)