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

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

books.sort! { |firstBook, secondBook| secondBook firstBook }

与:

books.sort!.reverse!

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

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

关于性能问题的初步答案已经certificate主要基于一个不正确的假设: sort.reverse没有固有的性能影响,因为没有块的sort似乎比使用sort更快,所以它抵消了第二次reverse呼叫的成本,可以忽略不计。

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


原始答案如下:

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

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

显然你必须问自己:“这段代码每秒运行多少次吗?” 或“此代码在应用程序的生命周期中运行一次吗?” 并且您的优先级将相应地改变,但通常,可维护性胜过性能。

使用第二个选项,直到您可以certificate它是性能瓶颈。

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

 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 

结果:

  user system total real 21.090000 0.030000 21.120000 ( 21.135562) 2.060000 0.020000 2.080000 ( 2.098318)