ちなみに

火曜日の空は僕を押しつぶした。

class_evalとsendのコスト

(修正) 何故か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誤差。