我在Ruby中学习了两种数组排序方法:
array = ["one", "two", "three"]
array.sort.reverse!
或者:
array = ["one", "two", "three"]
array.sort { |x,y| y<=>x }
我不能区分这两者。哪种方法更好,它们在执行过程中到底有什么不同?
发布于 2013-05-20 02:53:11
倒车!速度更快
基准测试通常是无法替代的。虽然它在较短的脚本中可能没有区别,但#reverse!方法比使用“太空船”操作符进行排序要快得多。例如,在MRI Ruby 2.0上,并给出了以下基准代码:
require 'benchmark'
array = ["one", "two", "three"]
loops = 1_000_000
Benchmark.bmbm do |bm|
bm.report('reverse!') { loops.times {array.sort.reverse!} }
bm.report('spaceship') { loops.times {array.sort {|x,y| y<=>x} }}
end
系统会报告#reverse!几乎是使用组合比较运算符的两倍。
user system total real
reverse! 0.340000 0.000000 0.340000 ( 0.344198)
spaceship 0.590000 0.010000 0.600000 ( 0.595747)
我的建议是:在给定的上下文中使用语义上更有意义的代码,除非您正在紧凑的循环中运行。
发布于 2013-05-20 02:25:24
与您的示例一样简单的比较,没有太大的区别,但由于比较公式变得复杂,最好避免将<=>
与块一起使用,因为您传递的块将针对数组的每个元素进行计算,从而导致冗余。请考虑以下内容:
array.sort{|x, y| some_expensive_method(x) <=> some_expensive_method(y)}
在这种情况下,将针对array
每个可能的元素对评估some_expensive_method
。
在您的特定情况下,可以使用reverse
来避免在<=>
中使用块。
array.sort_by{|x| some_expensive_method(x)}.reverse
这就是Schwartzian变换。
https://stackoverflow.com/questions/16637869
复制相似问题