【问题标题】:Merge of 2 active record arrays very slow?2个活动记录数组的合并非常慢?
【发布时间】:2010-10-24 19:58:27
【问题描述】:

我有2组数据如下:

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

检索数据很快,当我只返回其中一个数组时,我得到大约 30-40 req/s,但只要我执行以下操作以返回两个数组:

all_products = default_products +owned_products

性能下降到大约 3-4 req/s。为什么这个操作这么慢?有没有其他方法可以加快速度?

“产品”使用 STI 具有“家具”和“服装”等子类,这会导致任何性能问题吗?

谢谢

【问题讨论】:

  • 这两个数组有多大?

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


【解决方案1】:

我猜测使用“+”运算符会使事情变慢,因为实际上分配了一个新对象。我想这也可能是垃圾收集被触发的结果。如果您不介意修改一个或另一个数组,您可以使用'

这是我如何测量速度差异并说明修改数组的副作用。

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

【讨论】:

    【解决方案2】:

    如果后面的旧变量没用了,可以使用Array.concat

    default_products.concat(owned_products)
    

    这应该比将数组相加并返回结果更快,因为它不必创建新对象。

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

    【讨论】:

      猜你喜欢
      • 2015-02-23
      • 1970-01-01
      • 1970-01-01
      • 2012-10-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多