require 'benchmark/lab' def method_names(number) number.times.map do 10.times.inject("") { |e| e << ('a'..'z').to_a.sample} end end class DefineMethod def self.def_methods(_methods) _methods.each do |method_name| define_method method_name do puts "win" end end end end class ModuleEvalWithString def self.def_methods(_methods) _methods.each do |method_name| module_eval %{ def #{method_name} puts "win" end } end end end def fast(input_size) DefineMethod.def_methods(method_names(input_size)) end def slow(input_size) ModuleEvalWithString.def_methods(method_names(input_size)) end nbr_of_samples = 20 (1..10).each do |power| input_size = 10**power puts "Test for input size #{input_size}" Benchmark.experiment(nbr_of_samples) do |x| x.report("module_eval with string") { slow(input_size) } x.report("define_method") { fast(input_size) } end end