From: Farhad Farzaneh Date: 2007-05-31T08:12:34+09:00 Subject: Does this benchmark make sense? Hello, I was playing around with some Ruby features and benchmarked the following, showing that making a class call using "self.method" is faster than doing the same using "Classname.method". Doesn't make much sense to me, but I'm not much of a benchmarker, so am hoping someone will comment on this. require 'benchmark' class VarEval @@t=10 def self.t @@t end def t @@t end def self.time n=5_000_000 Benchmark.bm do |x| x.report("direct") { n.times { VarEval.t } } x.report("send") { n.times { VarEval.send(:t) } } x.report("eval") { n.times { eval("@@#{'t'}") } } end end def self.time2 n=5_000_000 Benchmark.bm do |x| x.report("direct") { n.times { self.t } } x.report("send") { n.times { self.send(:t) } } x.report("eval") { n.times { eval("@@#{'t'}") } } end end def time n=5_000_000 Benchmark.bm do |x| x.report("direct") { n.times { self.class.t } } x.report("send") { n.times { self.class.send(:t) } } x.report("eval") { n.times { eval("@@#{'t'}") } } end end def sanity puts "self.t=",self.t puts "self.class.t=",self.class.t puts %w{eval("@@#{'t'}")},eval("@@#{'t'}") end def self.sanity puts "self.t=",self.t puts "VarEval.t=",VarEval.t puts %w{eval("@@#{'t'}")},eval("@@#{'t'}") end end # VarEval.sanity # VarEval.new.sanity VarEval.time VarEval.time2 VarEval.new.time # RESULTS in ORDER for # VarEval.time # VarEval.time2 # VarEval.new.time # 5_000_000 tries # user system total real # direct 2.230000 0.010000 2.240000 ( 2.313980) # send 2.830000 0.020000 2.850000 ( 2.919039) # eval 11.440000 0.050000 11.490000 ( 11.667510) # user system total real # direct 1.880000 0.010000 1.890000 ( 1.900675) # send 2.460000 0.010000 2.470000 ( 2.509326) # eval 11.440000 0.050000 11.490000 ( 11.688772) # user system total real # direct 2.360000 0.010000 2.370000 ( 2.395637) # send 2.970000 0.010000 2.980000 ( 3.011359) # eval 11.460000 0.050000 11.510000 ( 11.651057) -- Posted via http://www.ruby-forum.com/.