2010-10-24 78 views
0

我有2组数据如下:合并2个活动记录数组非常慢?

default_products - 一组从分布式缓存 owned_products检索的活动记录的对象 - 一组从数据库

检索检索到的数据的活动记录的对象是快速和我避开30-40 REQ/s的时候才返回数组中的任何一个尚未只要我做下面的返回两个:

ALL_PRODUCTS = default_products + owned_products

性能骤降到各地3-4请求/秒。为什么这个操作很慢?有没有另外一种方法来做到这一点,以加快速度?

'产品'使用STI具有'家具'和'衣服'等子类可能导致任何性能问题?

感谢

+0

这两个阵列有多大? – SteveRawlinson 2010-10-25 16:46:17

回答

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