Open janko opened 9 years ago
While define_method indeed defines methods slighly faster than module_eval, I think it should be noted that calling methods defined with define_method is slower than calling module_eval ones (because define_method creates a closure):
define_method
module_eval
require "benchmark/ips" object = Class.new { module_eval "def evaled_method; end" define_method(:defined_method) {} }.new Benchmark.ips do |x| x.report("module_eval") { object.evaled_method } x.report("define_method") { object.defined_method } x.compare! end
Calculating ------------------------------------- module_eval 98.664k i/100ms define_method 93.809k i/100ms ------------------------------------------------- module_eval 6.794M (± 8.1%) i/s - 33.743M define_method 4.588M (± 6.7%) i/s - 22.889M Comparison: module_eval: 6793763.3 i/s define_method: 4587570.1 i/s - 1.48x slower
I think you benefit more from a method being faster to call than faster to define.
I wonder in which category this should go into? Any opinions, @ashwinisukale ?
While
define_method
indeed defines methods slighly faster thanmodule_eval
, I think it should be noted that calling methods defined withdefine_method
is slower than callingmodule_eval
ones (becausedefine_method
creates a closure):I think you benefit more from a method being faster to call than faster to define.