我正在为 iPhone 应用程序构建 Rails 后端。
在分析我的应用程序后,我发现以下调用在性能方面特别昂贵:
@messages.as_json
此调用返回大约 30 个消息对象,每个都包含许多子记录。如您所见,单个消息 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
我知道检查每个对象的缓存必须有一些开销。但我猜有一种比我现在的方式更有效的方法,基本上是连续的,一个接一个的。关于提高效率的任何指示?