RubyのRefinementされたメソッドの性能

通常のメソッドと比べて性能に差があるのかどうか比べてみた。

require 'benchmark'

class Integer
  def to_comma
    to_s.reverse.scan(/\d\d?\d?/).join(',').reverse
  end
end

def method_no_args
end

module RefineMethod
  refine Object do
    def refine_method_no_args
    end
  end
end

n = ARGV.shift || '1_000_000'
n = n.to_i
puts "#{n.to_comma} times."

Benchmark.bm(45) do |x|
  x.report('method_no_args') {
    n.times do
      method_no_args
    end
  }
  x.report('refine_method_no_args') {
    using RefineMethod
    n.times do
      refine_method_no_args
    end
  }
end

結果、まったく差がなかった。

1,000,000 times.
                                                    user     system      total        real
method_no_args                                  0.549699   0.000000   0.549699 (  0.550169)
refine_method_no_args                           0.500810   0.000000   0.500810 (  0.501193)

性能のことは気にせずRefinementを使おう。