Ruby中的数组排序怎么这么快?

Ruby中的数组排序怎么这么快?,ruby,sorting,Ruby,Sorting,C#有位数组,C有位字段。。我在Ruby内核中找不到一个等价物。谷歌向我展示了彼得·库珀(Peter Cooper)为同一主题编写的比特域类 我一直在阅读Jon Bentley的编程珍珠,在尝试第一个示例之一时,它涉及位图排序-我需要一个位数组类型。我用了彼得的课 class BitMapSort def self.sort(list, value_range_max) bitmap = BitField.new(value_range_max) list.each{|x|

C#有位数组,C有位字段。。我在Ruby内核中找不到一个等价物。谷歌向我展示了彼得·库珀(Peter Cooper)为同一主题编写的
比特域

我一直在阅读Jon Bentley的编程珍珠,在尝试第一个示例之一时,它涉及位图排序-我需要一个位数组类型。我用了彼得的课

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

ruby的默认排序比1M位域快22倍。在10M位向量上设置+1循环如何?Ruby中是否有更高效的位字段/数组?Ruby的默认排序是如何达到这种性能级别的。。是跳进C来完成这项工作的吗?

之所以速度如此之快,可能是因为它是在C中的ruby实现中实现的

Ruby的默认排序是如何达到这种性能级别的。。是跳进C来完成这件事吗


ruby默认实现中的所有核心类和方法都是用C实现的。

我认为这里真正的问题是你要做10万次比较,10万次数组获取,10万次很多事情,而一个经过适当优化的排序例程所做的操作要少得多,因为它使用的是固定的1万个项目集

诸如排序之类的基本操作在Ruby VM中得到了高度优化,用纯Ruby替代品很难击败。

是用C实现的,请参见中的
rb\u ariu\u sort


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

跳入C完全正确。为了提高性能,Array和Hash都有许多方法的C实现。整数和浮点文本也有一些棘手的代码优化。当您将它们转换为位图时,您也会失去这种优化


对于C或Java这样的编译语言,寻找复杂的优化模式是非常有意义的。对于解释型语言,解释每个命令的成本会适得其反

这就引出了一个问题。。如果我想编写比Array#sort性能更好的BitMapSort(因为它更适合此处的输入列表-受限范围内的唯一编号),那么我唯一的选择是用C编写代码吗?我在纯C#中重复了这个练习,BitMapSort胜过Array.Sort。如果我从[0,2M]而不是[0,10M]的范围内选择1M个nos,那么时间就减少了一半。有趣的是……主要是方法调用开销。ruby 1.8中的方法调用非常慢,根本没有缓存。
                         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); }
    }