Ruby:为什么Array.sort对于大对象来说缓慢?

前端之家收集整理的这篇文章主要介绍了Ruby:为什么Array.sort对于大对象来说缓慢?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
同事需要在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

解决方法

排序绝对不会复制对象.在使用EventSorter的代码和没有它的代码(没有提供的代码,所以我必须猜到)之间,我可以想象的一个区别是,EventSorter只是一次调用event.sqn和event.time,并将结果存储在变量中.在排序期间,只需要访问变量.原始版本大概称为每次调用sort-block时的sqn和时间.

如果是这种情况,可以使用sort_by而不是排序来修复它. sort_by仅对每个对象调用一次块,然后使用块的缓存结果进行进一步的比较.

猜你在找的Ruby相关文章