如何快速地将Ruby排序在Ruby中?

时间:2009-08-27 18:21:51

标签: ruby sorting

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来完成这项工作?

5 个答案:

答案 0 :(得分:10)

Array#sort在C中实施,请参阅array.c

中的rb_ary_sort

它还有一些比较Fixnums的检查,因此排序整数数组甚至不需要方法查找。

答案 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这样的编译语言,寻找棘手的优化模式真的很有意义。使用解释型语言,解释每个命令的成本会使这种反制效率提高。

相关问题