我的同事需要对Rails应用程序中的一个ActiveRecord对象数组进行排序。 他尝试了显而易见的Array.sort!
,但似乎速度非常慢,对于3700个对象的数组,需要32秒的时间。 因此,以防这些大型对象拖慢速度,他重新实现了排序,通过对小对象数组进行排序,然后重新排列原始的ActiveRecord对象数组以匹配 - 如下所示。 Tada! 现在排序只需要700毫秒。
这真的让我很惊讶。Ruby的sort方法最终会复制对象到各个地方,而不仅仅是引用吗?他正在使用Ruby 1.8.6 / 7。
def self.sort_events(events)
event_sorters = Array.new(events.length) {|i| EventSorter.new(i, events[i])}
event_sorters.sort!
event_sorters.collect {|es| events[es.index]}
end
private
# Class used by sort_events
class EventSorter
attr_reader :sqn
attr_reader :time
attr_reader :index
def initialize(index, event)
@index = index
@sqn = event.sqn
@time = event.time
end
def <=>(b)
@time != b.time ? @time <=> b.time : @sqn <=> b.sqn
end
end
<=>
方法也可以写成:(@time <=> b.time).nonzero? or @sqn <=> b.sqn
。 - glenn jackman