2个活动记录数组的合并速度很慢?

时间:2010-10-24 19:58:27

标签: ruby-on-rails ruby arrays activerecord merge

我有两组数据如下:

default_products - 从memcached中检索的一组活动记录对象 owned_products - 从数据库中检索的一组活动记录对象

检索数据的速度很快,只要我返回其中一个阵列,我就会得到大约30-40 req / s,只要我执行以下操作即可返回:

all_products = default_products + owned_products

性能急剧下降至约3-4 req / s。为什么这个操作这么慢?还有另一种方法可以加快速度吗?

“产品”使用STI来创建“家具”和“服装”等子类会导致性能问题吗?

由于

2 个答案:

答案 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