我有两组数据如下:
default_products - 从memcached中检索的一组活动记录对象 owned_products - 从数据库中检索的一组活动记录对象
检索数据的速度很快,只要我返回其中一个阵列,我就会得到大约30-40 req / s,只要我执行以下操作即可返回:
all_products = default_products + owned_products
性能急剧下降至约3-4 req / s。为什么这个操作这么慢?还有另一种方法可以加快速度吗?
“产品”使用STI来创建“家具”和“服装”等子类会导致性能问题吗?
由于
答案 0 :(得分:0)
我猜测使用'+'运算符会使事情变慢,因为实际上会分配一个新对象。我想这也可能是垃圾收集被触发的结果。如果你不介意修改一个或另一个数组,你可以使用'<<'运营商,这真的很快。
以下是我如何测量速度差异并说明修改阵列的副作用。
require 'benchmark'
a, b = [], []
array_size = 1000
random_limit = 1000
array_size.times { a << rand; b << rand }
p "starting count and object_ids"
p a.count, a.object_id
p b.count, b.object_id
p "resulting object_ids"
p (a<<b).object_id
p (a + b).object_id
n = 50000
Benchmark.bm do |x|
x.report { n.times {a + b }}
x.report { n.times {a << b }}
end
p "notice that the count has changed from 1000 to 51000 for the '<<' method"
p a.count, a.object_id
p b.count, b.object_id
答案 1 :(得分:0)
如果之后没有使用旧变量,可以使用Array.concat
default_products.concat(owned_products)
这应该比将数组添加到一起并返回结果更快,因为它不必创建新对象。
请参阅:http://www.ruby-doc.org/core-1.9.3/Array.html#method-i-concat