2010-10-24 4 views
0

У меня есть 2 набора данных следующим образом:Слияние двух активных массивов записей очень медленно?

default_products - Набор активных записей объектов, извлекаемых из Memcached owned_products - Набор активных записей объектов, извлекаемых из базы данных

Извлечение данных быстро и я получить около 30-40 REQ/с, когда только возвращая либо один из массивов еще, как только я сделать следующее, чтобы вернуться как:

all_products = default_products + owned_products

Performance грузила около 3-4 req/s. Почему эта операция настолько медленная? Есть ли другой способ сделать это, чтобы ускорить процесс?

Использование продуктов STI для подклассов, таких как «Мебель» и «Одежда», может вызвать проблемы с производительностью?

Благодаря

+0

Насколько велики эти два массива? – SteveRawlinson

ответ

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 
0

Если у вас нет никакой пользы для старых переменных после этого, вы можете использовать Array.concat

default_products.concat(owned_products) 

Это должно быть быстрее, чем добавление массивов вместе, и возвращает результат, поскольку он не имеет для создания нового объекта.

http://www.ruby-doc.org/core-1.9.3/Array.html#method-i-concat

Смежные вопросы