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仅对每个对象调用一次块,然后使用块的缓存结果进行进一步的比较. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
推荐文章
站长推荐
- Sqlite 分页(http://www.cnblogs.com/shang5388
- ruby-on-rails-3 – 以rails形式覆盖表单字段值
- c# – 如何知道我是否要获得OutOfMemoryExceptio
- 解析XML格式数据的方式——Pull解析、SAX解析
- 选择排序算法,C语言选择排序算法详解
- iPhone – 关闭应用内购买?
- 关于pc上的flash动画转移到Cocos2d-x使用
- OpenERP 的XML-RPC的轻度体验+many2many,one2man
- 使用ajaxSubmit异步,提交时MultipartFile必须有
- ruby-on-rails – 删除嵌套属性时未允许的属性_d
热点阅读