有什么好处(如果有的话):
books.sort! { |firstBook, secondBook| secondBook <=> firstBook }
与
books.sort!.reverse!
第二种选择似乎更清晰,更容易理解..
编辑:我想这可能是一个问题,&lt; =&gt;的其他用途是什么?除1对1排序以外的运算符?
答案 0 :(得分:6)
我对性能问题的初步答案已经证明主要基于一个错误的假设:sort.reverse
没有固有的性能影响,因为没有阻止的sort
似乎比{{1}更快带有块的,以至于它抵消了第二次sort
调用的成本,这可以忽略不计。
但是,我的回答的主旨仍然有效:您应该选择第二行,因为它更具可读性,并且在您发现性能问题时担心找出哪个是更快的选项。
原始答案如下:
第二种选择更昂贵。它按升序对所有内容进行排序,然后反转数组,两个不同的进程,而第一个选项立即按降序生成数组。
那就是说,第二种选择是我更喜欢的选择。通常,更喜欢生成可读的,可维护的代码而不是过早地优化性能。
显然你必须问自己:“这段代码每秒运行多次吗?”或者“此代码在应用程序的生命周期内运行一次吗?”并且您的优先级会相应地发生变化,但通常情况下,可维护性会超过性能。
使用第二个选项,直到您可以证明它是性能瓶颈。
答案 1 :(得分: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
结果:
user system total real
21.090000 0.030000 21.120000 ( 21.135562)
2.060000 0.020000 2.080000 ( 2.098318)