Ruby attr_accessor与getter / setter基准:为什么访问器更快?

我刚刚对等效的getter / setter-methods测试了attr_accessor:

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) 

程序输出是:

 direct: 0.2640s accessor: 0.1927s 

所以attr_accessor明显更快。 有人可以分享一些智慧,为什么会这样?

在不深入理解差异的情况下,我至少可以说attr_accessor (和attr_readerattr_writer )是用C实现的,正如您在该页面上切换源所看到的那样。 您的方法将在Ruby中实现,而Ruby方法比本机C函数具有更多的调用开销。

这篇文章解释了为什么Ruby方法调度往往很慢 。