【发布时间】:2015-01-18 19:35:18
【问题描述】:
我在尝试提高代码性能的方法中拥有这些模型和以下行。
class Location < ActiveRecord::Base
belongs_to :company
end
class Company < ActiveRecord::Base
has_many :locations
end
在方法中:
locations_company = []
###
found_locations = Location.within(distance, origin: from_result.split(',')).order("distance ASC")
### 0.002659s
###
found_locations.each do |location|
locations_company << location.company
end
### 45.972285s
###
companies = locations_company.uniq{|x| x.id}
### 0.033029s
代码具有此功能 - 首先,抓取指定半径内的所有位置。然后,从找到的每一行中取出公司并将其保存到准备好的数组中。这是有问题的部分 - 每个循环需要 45 秒来处理。
然后从这个新创建的数组中删除重复项。
我仍然想知道是否有更好的方法来解决这种情况,但我担心我现在看不到它,所以我想问你们如何加快 .each 循环将数据保存到数组中 - ruby 中是否有更好的方法从对象中获取一些信息?
非常感谢您的宝贵时间,我整天都沉浸在这个问题中,但仍然没有更有效的解决方案。
【问题讨论】:
-
如果您查看
found_locations,您会注意到它可能是一个查询代理,而不是一个合并的结果集。#each几乎肯定不是你的瓶颈;您应该正确地分析您的代码以找到瓶颈。 -
这个问题似乎是题外话,因为它是关于重构和提高现有代码的性能,应该在Code Review。
标签: ruby-on-rails ruby arrays performance each