Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Ruby attr_accessor vs. getter/setter benchmark: why is accessor faster?

I just tested attr_accessor against equivalent getter/setter-methods:

class A
  # we define two R/W attributes with accessors
  attr_accessor :acc, :bcc

  # we define two attributes with getter/setter-functions
  def dirA=(d); @dirA=d; end
  def dirA; @dirA; end
  def dirB=(d); @dirB=d; end
  def dirB; @dirB; end
end

varA   = A.new
startT = 0
dirT   = 0
accT   = 0

# now we do 100 times the same benchmarking
# where we do the same assignment operation
# 50000 times
100.times do
  startT = Time.now.to_f
  50000.times do |i|
    varA.dirA = i
    varA.dirB = varA.dirA
  end
  dirT += (Time.now.to_f - startT)

  startT = Time.now.to_f
  50000.times do |i|
    varA.acc = i
    varA.bcc = varA.acc
  end
  accT += (Time.now.to_f - startT)
end

puts "direct:   %10.4fs" % (dirT/100)
puts "accessor: %10.4fs" % (accT/100)

Program output is:

direct:       0.2640s
accessor:     0.1927s

So the attr_accessor is significantly faster. could someone please share some wisdom, why this is so?

like image 724
rhavin Avatar asked Nov 21 '12 13:11

rhavin


1 Answers

Without deeply understanding the differences, I can at least say that attr_accessor (and attr_reader and attr_writer) are implemented in C, as you can see by toggling the source on that page. Your methods will be implemented in Ruby, and Ruby methods have more call overhead than native C functions.

Here's an article explaining why Ruby method dispatch tends to be slow.

like image 98
Brandan Avatar answered Oct 07 '22 01:10

Brandan