読者です 読者をやめる 読者になる 読者になる

Ruby における new のコスト

ttanimichi/bigquery-client を作っていて、ビックデータを扱う都合上、性能が気になった。クラスメソッドで済ませることもできるけど、できればインスタンスメソッドにしたい処理があって、インスタンスを new することがどれくらいのコストになるのか測ってみた。

結論

今回の計測では 100 万回実行して 0.1 秒程度しか差がつかなかったので、ほとんどの場合は気にする必要なさそう。

ベンチマーク

class A
  def self.a
  end
end

class B
  def b
  end
end

require 'benchmark'

n = 1_000_000

Benchmark.bm do |benchmark|
  benchmark.report do
    n.times { A.a }
  end

  benchmark.report do
    n.times { B.new.b }
  end
end

実行結果

% ruby new.rb
       user     system      total        real
   0.070000   0.000000   0.070000 (  0.069095)
   0.170000   0.000000   0.170000 (  0.165810)

環境

% ruby -v
ruby 2.2.3p173 (2015-08-18 revision 51636) [x86_64-darwin14]

% system_profiler SPHardwareDataType
Hardware:

    Hardware Overview:

      Model Name: iMac
      Model Identifier: iMac14,1
      Processor Name: Intel Core i5
      Processor Speed: 2.7 GHz
      Number of Processors: 1
      Total Number of Cores: 4
      L2 Cache (per Core): 256 KB
      L3 Cache: 4 MB
      Memory: 16 GB
      Boot ROM Version: IM141.0118.B11
      SMC Version (system): 2.14f24
      Serial Number (system): C02PC03NF8J7
      Hardware UUID: B7E5A3F8-3E25-53DE-B38A-1B685A146C58

% sw_vers
ProductName:    Mac OS X
ProductVersion: 10.10.5
BuildVersion:   14F27

メタプログラミングRuby 第2版

メタプログラミングRuby 第2版