gpt4 book ai didi

Ruby:为什么 Array.sort 对大对象很慢?

转载 作者:数据小太阳 更新时间:2023-10-29 06:41:50 24 4
gpt4 key购买 nike

一位同事需要对 Rails 应用程序中的 ActiveRecord 对象数组进行排序。他尝试了明显的 Array.sort! 但它似乎出奇地慢,一个包含 3700 个对象的数组需要 32 秒。因此,为了防止这些大胖对象减慢速度,他通过对小对象数组进行排序来重新实现排序,然后重新排序 ActiveRecord 对象的原始数组以匹配 - 如下面的代码所示。多田!排序现在需要 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

最佳答案

sort 绝对不会复制对象。我可以想象使用 EventSorter 的代码和没有它的代码(您没有提供,所以我不得不猜测)之间的一个区别是 EventSorter 调用 event.sqnevent。 time 恰好一次并将结果存储在变量中。在排序期间,只需要访问变量。每次调用排序 block 时,原始版本可能会调用 sqntime

如果是这种情况,可以使用 sort_by 而不是 sort 来解决。 sort_by 每个对象只调用一次 block ,然后使用 block 的缓存结果进行进一步比较。

关于Ruby:为什么 Array.sort 对大对象很慢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2439401/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com