Коллеге необходимо было отсортировать массив объектов ActiveRecord в приложении Rails. Он пробовал очевидный Array.sort!, но он казался неожиданно медленным, взяв 32s для массива из 3700 объектов. Таким образом, на всякий случай, когда эти большие жирные объекты замедляли работу, он повторно реализовал сортировку, сортируя массив мелких объектов, а затем переупорядочивая исходный массив объектов ActiveRecord для соответствия - как показано в приведенном ниже коде. Тада! Сорт теперь занимает 700 мс.
Это меня действительно удивило. Использует ли метод сортировки 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