C # имеет BitArray, C имеет битовые поля .. Я не смог найти эквивалент в ядре Ruby. Google показал мне BitField
класс, который Питер Купер написал для того же.
Я читал «Программирование жемчуга» Джона Бентли и, пока пробовал один из первых примеров, который касается сортировки BitMap, - мне нужен был тип, представляющий собой массив битов. Я использовал класс Питера
class BitMapSort
def self.sort(list, value_range_max)
bitmap = BitField.new(value_range_max)
list.each{|x| bitmap[x] = 1 }
sorted_list = []
0.upto(value_range_max-1){ |number|
sorted_list << number if (bitmap[number] == 1)
}
sorted_list
end
end
Выполнение этого для набора из 1М уникальных чисел в диапазоне [0, 10 000 000) дало некоторые интересные результаты,
user system total real
bitmap 11.078000 0.015000 11.093000 ( 11.156250)
ruby-system-sort 0.531000 0.000000 0.531000 ( 0.531250)
quick-sort 21.562000 0.000000 21.562000 ( 21.625000)
Benchmark.bm(20){|x|
x.report("bitmap"){ ret = BitMapSort.sort(series, 10_000_000);}
x.report("ruby-system-sort"){ ret = series.sort; }
x.report("quick-sort"){ ret = QuickSort.sort( series, 0, series.length-1); }
}
Как сортировка по умолчанию в ruby в 22 раза быстрее, чем 1M BitField.set + 1 цикл по 10M битовому вектору? Есть ли в Ruby более эффективное битовое поле / массив? Как сортировка по умолчанию в Ruby позволяет достичь такого уровня производительности ... Неужели это происходит в C, чтобы это сделать?