使用<=>而不仅仅是排序和反转是否有好处?

MrD*_*Duk 3 ruby

这样做有什么好处(如果有的话):

books.sort! { |firstBook, secondBook| secondBook <=> firstBook }

与:

books.sort!.reverse!

第二个选项似乎更清晰,更容易理解..

编辑:我想这可能是一个问题,除了1对1排序之外,<=>运算符的其他用途是什么?

mea*_*gar 6

我对性能的关注最初的答案已经被证明是很大程度上是基于不正确的假设:有没有性能的影响在固有的sort.reverse,因为sort没有块似乎快于sort 一个块,以至于它抵消了第二的成本reverse呼叫,这是微不足道的.

但是,我的答案的要点仍然有效:您应该选择第二行,因为它更具可读性,并且在您确定性能问题时担心找出哪个是更快的选项.


原始答案如下:

第二种选择更昂贵.它按升序对所有内容进行排序,然后反转数组,两个不同的进程,而第一个选项立即按降序生成数组.

也就是说,第二种选择是我更喜欢的选择.通常,更喜欢生成可读的,可维护的代码而不是过早地优化性能.

显然你必须问自己:"这段代码每秒运行多少次?" 或者"此代码在应用程序的生命周期内运行一次吗?" 并且您的优先级会相应地发生变化,但通常,可维护性会超过性能.

使用第二个选项,直到您可以证明它是性能瓶颈.


Bro*_*tse 6

我很惊讶,但似乎第二种选择更快,而不仅仅是小%.

require 'benchmark'
array = (1..10**7).to_a.shuffle
Benchmark.bm do |x|
  x.report { array.sort { |firstBook, secondBook| secondBook <=> firstBook }}
  x.report { array.sort.reverse }
end
Run Code Online (Sandbox Code Playgroud)

结果:

     user     system      total        real
  21.090000   0.030000  21.120000 ( 21.135562)
   2.060000   0.020000   2.080000 (  2.098318)
Run Code Online (Sandbox Code Playgroud)

  • 我的猜测是使用内部c函数完成整个int,而有块的那个需要继续调用ruby解释器. (4认同)