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した方が微妙に早いのは意外だった。
どんだけ効率いいんだよ。恐るべし組み込みメソッド。