Коллеге необходимо было отсортировать массив объектов 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