2010-10-24 75 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