Matchu
9e3cac82ec
Some lame benchmarking on my box, dev, cache classes, many items: No proxies: Fresh JSON: 175, 90, 90, 93, 82, 88, 158, 150, 85, 167 = 117.8 Cached JSON: (none) Fresh HTML: 371, 327, 355, 328, 322, 346 = 341.5 Cached HTML: 173, 123, 175, 187, 171, 179 = 168 Proxies: Fresh JSON: 175, 183, 269, 219, 195, 178 = 203.17 Cached JSON: 88, 70, 89, 162, 80, 77 = 94.3 Fresh HTML: 494, 381, 350, 334, 451, 372 = 397 Cached HTML: 176, 170, 104, 101, 111, 116 = 129.7 So, overhead is significant, but the gains when cached (and that should be all the time, since we currently have 0 evictions) are definitely worth it. Worth pushing, and probably putting some future effort into reducing overhead. On production (again, lame), items#index was consistently averaging 73-74ms when super healthy, and 82ms when pets#index was being louder than usual. For reference is all. This will probably perform significantly worse at first (in JSON, anyway, since HTML is already mostly cached), so it might be worth briefly warming the cache after pushing.
40 lines
No EOL
1.1 KiB
Ruby
40 lines
No EOL
1.1 KiB
Ruby
class Item
|
|
class ProxyArray < Array
|
|
# TODO: do we really need to include translations? The search documents
|
|
# know the proper name for each locale, so proxies can tell their
|
|
# parent items what their names are and save the query entirely.
|
|
SCOPES = HashWithIndifferentAccess.new({
|
|
method: {
|
|
as_json: Item.includes(:translations),
|
|
},
|
|
partial: {
|
|
item_link_partial: Item.includes(:translations)
|
|
}
|
|
})
|
|
|
|
def initialize(ids)
|
|
self.replace(ids.map { |id| Proxy.new(id.to_i) })
|
|
end
|
|
|
|
def prepare_method(name)
|
|
prepare(:method, name)
|
|
end
|
|
|
|
def prepare_partial(name)
|
|
prepare(:partial, name)
|
|
end
|
|
|
|
private
|
|
|
|
def prepare(type, name)
|
|
missed_proxies_by_id = self.
|
|
reject { |p| p.cached?(type, name) }.
|
|
index_by(&:id)
|
|
item_scope = SCOPES[type][name]
|
|
raise "unexpected #{type} #{name.inspect}" unless item_scope
|
|
item_scope.find(missed_proxies_by_id.keys).each do |item|
|
|
missed_proxies_by_id[item.id].item = item
|
|
end
|
|
end
|
|
end
|
|
end |