C#有BitArray,C有位字段..我在Ruby核心中找不到等价物。谷歌向我展示了Peter Cooper所写的BitField
课程。
我一直在阅读Jon Bentley的Programming Pearls,在尝试第一个处理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
在[0,10,000,000]范围内的一组1M唯一数字上运行它,产生了一些有趣的结果,
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); }
}
对于10M位向量,ruby的默认排序比1M BitField.set + 1循环快22倍? Ruby中是否有更高效的位字段/数组? Ruby的默认排序如何达到这种性能水平..它是否会跳到C来完成这项工作?
答案 0 :(得分:10)
答案 1 :(得分:7)
Ruby的默认排序如何达到这种性能水平..是否会跳到C来完成这项工作?
ruby默认实现中的所有核心类和方法都是用C实现的。
答案 2 :(得分:2)
之所以这么快,可能是因为它是在C中的ruby实现中实现的。
答案 3 :(得分:2)
我认为这里真正的问题是你正在进行10M比较,10M数组提取,10M很多事情,而正确优化的排序例程所做的操作要少得多,因为它使用了一组固定的1M项目
排序等基本操作在Ruby VM中得到了高度优化,并且很难被纯Ruby替代。
答案 4 :(得分:2)
跳入C是完全正确的。 Array和Hash都有许多方法的C实现,以提高性能。整数和浮点文字也有一些棘手的代码优化。当您将它们转换为位图时,您也会放弃此优化。
使用像C或Java这样的编译语言,寻找棘手的优化模式真的很有意义。使用解释型语言,解释每个命令的成本会使这种反制效率提高。