Слияние 2 активных массивов записей очень медленно? - PullRequest
0 голосов
/ 24 октября 2010

У меня есть 2 набора данных следующим образом:

default_products - набор активных объектов записи, извлеченных из memcached own_products - набор объектов активных записей, извлеченных из базы данных

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

все_продукты = стандартные_продукты + собственные_продукты

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

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

Спасибо

Ответы [ 2 ]

0 голосов
/ 22 июля 2012

Если впоследствии вы не используете старые переменные, вы можете использовать Array.concat

default_products.concat(owned_products)

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

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

0 голосов
/ 23 августа 2011

Я предполагаю, что использование оператора '+' замедляет работу, потому что фактически выделяет новый объект.Я полагаю, это также может быть результатом запуска сборки мусора.Если вы не возражаете против изменения одного или другого массива, вы можете использовать оператор <<, который действительно быстр. </p>

Вот как я измерил разницу в скорости и проиллюстрировал побочный эффект изменения массива.

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...