Rails バックエンドを iPhone アプリに構築しています。
アプリケーションをプロファイリングした後、次の呼び出しがパフォーマンスの点で特に高価であることがわかりました。
@messages.as_json
この呼び出しは、それぞれが多くの子レコードを含む約 30 個のメッセージ オブジェクトを返します。ご覧のとおり、1 つのメッセージ json 応答によって、多くの DB 呼び出しが作成される場合があります。
def as_json(options={})
super(:only => [...],
:include => {
:user => {...},
:checkin => {...}
}},
:likes => {:only => [...],
:include => { :user => {...] }}},
:comments => {:only => [...],
:include => { :user => {:only => [...] }}}
},
:methods => :top_highlight)
end
平均して、@messages.as_json
呼び出し (30 個のオブジェクトすべて) には約 1100 ミリ秒かかります。
最適化したいので、memcached を採用しました。以下のソリューションでは、すべてのメッセージ オブジェクトがキャッシュにある場合、平均応答は 200 ~ 300 ミリ秒になりました。これには満足していますが、キャッシュ ミスのシナリオがさらに遅くなるという問題があります。キャッシュに何もない場合、計算に 2000 ミリ秒以上かかるようになりました。
# Note: @messages has the 30 message objects in it, but none of the child records have been grabbed
@messages.each_with_index do |m, i|
@messages[i] = Rails.cache.fetch("message/#{m.id}/#{m.updated_at.to_i}") do
m.as_json
end
end
各オブジェクトのキャッシュをチェックするには、いくらかのオーバーヘッドが必要になることを理解しています。しかし、私が現在行っている方法よりも効率的な方法があると思います。これをより効率的にするための指針はありますか?