首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Array#sort在Ruby语言中是怎么这么快的?

Array#sort在Ruby语言中是怎么这么快的?
EN

Stack Overflow用户
提问于 2009-08-27 18:21:51
回答 5查看 3K关注 0票数 2

C#有BitArray,C有bit字段。我在Ruby内核中找不到对应的东西。谷歌向我展示了Peter Cooper为同样的目的编写的一个BitField类。

我一直在阅读Jon Bentley的Programming Pearls,在尝试第一个处理BitMap排序的示例之一时,我需要一个位数组的类型。我用了彼得的课

代码语言:javascript
复制
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个唯一数字上运行它,产生了一些有趣的结果,

代码语言:javascript
复制
                         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的默认排序比10M位向量上的1M BitField.set +1循环快22倍?在Ruby中有没有更有效的位域/数组?Ruby的默认排序是如何实现这种级别的性能的。它是不是跳到C来完成这件事?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2009-08-27 18:35:54

Array#sort是用C实现的,请参见array.c中的rb_ary_sort

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

票数 10
EN

Stack Overflow用户

发布于 2009-08-27 18:32:22

的默认排序是如何实现这种性能水平的..它是不是跳到C来完成这件事?

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

票数 7
EN

Stack Overflow用户

发布于 2009-08-27 18:31:16

其速度如此之快的原因可能是因为它是在ruby实现中用C实现的。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1342886

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档