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

时间:2014-01-14 15:56:47

标签: ruby

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

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

books.sort!.reverse!

第二种选择似乎更清晰,更容易理解..

编辑:我想这可能是一个问题,&lt; =&gt;的其他用途是什么?除1对1排序以外的运算符?

2 个答案:

答案 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)