加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-16 19:38:52 所属栏目:百科 来源:网络整理
导读:同事需要在Rails应用程序中排列一组ActiveRecord对象.他尝试了明显的Array.sort!但是看起来令人惊讶的是慢了32秒,一系列的3700个对象.所以为了防止这些大胖子减慢事情,他通过对一些小对象进行排序来重新实现排序,然后重新排列ActiveRecord对象的原始数组以
同事需要在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仅对每个对象调用一次块,然后使用块的缓存结果进行进一步的比较.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读