同事需要在Rails应用程序中排列一组ActiveRecord对象.他尝试了明显的Array.sort!但是看起来令人惊讶的是慢了32秒,一系列的3700个对象.所以为了防止这些大胖子减慢事情,他通过对一些小对象进行排序来重新实现排序,然后重新排列ActiveRecord对象的原始数组以使其相匹配,如下面的代码所示.田田!排序现在需要700ms.
真的让我很惊讶Ruby的排序方法是否结束复制对象的地方,而不仅仅是引用?他使用的是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