sort.reverseとsort_by{ |val| -val }の速度差

色々気になったので試してみた。

require "benchmark"

array = Array.new(100){ |index| index }.sort_by{ rand }

array1 = array.dup
array2 = array.dup
array3 = array.dup

Benchmark.bm(16) do |bm|
  bm.report("sort.reverse    "){ 1000.times{ array1.sort.reverse                      } }
  bm.report("sort_by{-val}   "){ 1000.times{ array2.sort_by{ |value| -value }         } }
  bm.report("sort_by.reverse "){ 1000.times{ array3.sort_by{ |value|  value }.reverse } }
end

三回実行した結果

                      user     system      total        real
sort.reverse      0.000000   0.060000   0.060000 (  0.047870)
sort_by{-val}     0.170000   0.340000   0.510000 (  0.507051)
sort_by.reverse   0.160000   0.330000   0.490000 (  0.485916)
                      user     system      total        real
sort.reverse      0.000000   0.040000   0.040000 (  0.041189)
sort_by{-val}     0.290000   0.210000   0.500000 (  0.499669)
sort_by.reverse   0.180000   0.290000   0.470000 (  0.480465)
                      user     system      total        real
sort.reverse      0.000000   0.010000   0.010000 (  0.039783)
sort_by{-val}     0.320000   0.230000   0.550000 (  0.523011)
sort_by.reverse   0.180000   0.320000   0.500000 (  0.507468)

sort.reverseが一番早いのはまあ予想通りだが、マイナスしたsort_byよりもsort_by後にreverseした方が微妙に早いのは意外だった。
どんだけ効率いいんだよ。恐るべし組み込みメソッド。