(修正) 何故かinstance_evalとclass_evalを間違っていた
class_evalとsendはどちらの方がコストが高いのか気になったのでベンチマークを取ってみた。
require 'benchmark' module Foo def self.included(base) base.extend ClassMethods end module ClassMethods def activate_foo__class_eval class_eval(<<-EOE, __FILE__, __LINE__+1) include Foo::InstanceMethods EOE end def activate_foo__send self.__send__ :include, Foo::InstanceMethods end end module InstanceMethods 100000.times do |i| define_method(:"method_#{i}") {} end end end (Bar = Class.new).__send__ :include, Foo Benchmark.bm(13) do |x| x.report('class_eval') { Bar.activate_foo__class_eval } x.report('send') { Bar.activate_foo__send } end
結果
user system total real class_eval 0.000000 0.000000 0.000000 ( 0.000094) send 0.000000 0.000000 0.000000 ( 0.000021)
うーん、very誤差。