Коллега должен был отсортировать массив объектов ActiveRecord в приложении Rails. Он попробовал очевидное Array.sort!
, но оно показалось удивительно медленным, взяв 32 с для массива из 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