module Memoize
def memoize(fn)
cache = {}
lambda{|*args|
val = cache[args]
if cache.has_key?(args)
val
else
cache[args] = __send__(fn, *args)
end
}
end
end
def f(x)
sleep 0.2
x*10
end
require 'benchmark'
include Benchmark
def real(&block)
measure(&block).real
end
include Memoize
memf = memoize(:f)
real{ memf[100] }
real{ memf[100] }
real{ memf[100] }
memf[100]
Kernel.module_eval { define_method(:mf, &memf) }
real{ mf(7) }
real{ mf(7) }
mf(7)
class Hoge
def f(x)
sleep 0.2
x*100
end
module_eval do
extend Memoize
define_method(:mf, &memoize(:f))
end
end
h = Hoge.new
real { h.mf(99) }
real { h.mf(99) }