rha*_*vin 10 ruby benchmarking attr-accessor getter-setter
我刚刚对等效的getter/setter方法测试了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)
Run Code Online (Sandbox Code Playgroud)
程序输出是:
direct: 0.2640s
accessor: 0.1927s
Run Code Online (Sandbox Code Playgroud)
所以attr_accessor
速度要快得多.有人可以分享一些智慧,为什么会这样?
Bra*_*dan 10
如果没有深入了解的差异,我至少可以说,attr_accessor
(和attr_reader
和attr_writer
)用C实现的,因为你可以通过切换该网页上的源代码看到.您的方法将在Ruby中实现,而Ruby方法比本机C函数具有更多的调用开销.
这篇文章解释了为什么Ruby方法调度往往很慢.