2012-11-21 15 views
10

właśnie testowane attr_accessor od równoważnych getter/setter-metod:Ruby attr_accessor vs test porównawczy getter/setter: dlaczego akcesor jest szybszy?

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) 

wyjście programu jest:

direct:  0.2640s 
accessor:  0.1927s 

Więc attr_accessor jest znacznie szybsze. Czy ktoś mógłby podzielić się mądrością, dlaczego tak jest?

+3

Do testu porównawczego można użyć modułu stdlib Benchmark: http://www.ruby-doc.org/stdlib-1.9.3/libdoc/benchmark/rdoc/Benchmark.html#method-c-bm. –

+0

Thx za notatkę. Brzmi jak moduł, który powinien wypróbować następnym razem:] – rhavin

Odpowiedz

10

głęboko Bez zrozumienia różnic, mogę przynajmniej powiedzieć, że attr_accessor (i attr_reader i attr_writer) są zaimplementowane w C, jak widać przez przełączenie źródła na tej stronie. Twoje metody zostaną zaimplementowane w Ruby, a metody Ruby mają więcej narzutów niż natywne funkcje języka C. Jest to artykuł wyjaśniający .

+0

Thx za link, bardzo informacyjny – rhavin

+0

Nie ma za co. Jeśli uważasz, że odpowiedziałeś na pytanie, proszę, zaakceptuj odpowiedź. – Brandan

Powiązane problemy