使用而不仅仅是排序和反转是否有好处?
这样做有什么好处(如果有的话):
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)