lambda-procの使いどころ

関数内関数の代わりにlambdaとか使っちゃダメかもしれない。
(前回作ったmapperのところも関数にした方が早いかも。)

def sum1 n
  (n == 0)? 0 :n + (sum1(n-1))
end

def sum2 n
   sum_iter = proc do |c,r| 
     (c == 0)? r : sum_iter[(c-1),(r+c)]
   end
   sum_iter[n,0]

  #クロージャだから重いのは当たり前かも。
  #毎回変数などの内容を保持する環境を作っているかもしれないし
  #ということは、procによる再帰はダメかもしれない。
end

def sum3 n
  def iter a,b
    (b == 0)? a : iter((a+b),(b-1))
  end
  iter 0,n
end

def sum4 n
  (1..n).inject{|r,n|r+n}
end

def sum5 n
  result = 0
  (1..n).each {|e| result += e}
  result
end

require 'benchmark'
#p send(:sum1,10)
Benchmark.bm do |x|
  n = 1000
  (1..5).each {|e| x.report("sum#{e}") {n.times{|i| send("sum#{e}",i)}}}
end

結果

      user     system      total        real
sum1  1.130000   0.080000   1.210000 (  1.197280)
sum2  2.830000   0.340000   3.170000 (  3.172831)
sum3  0.970000   0.080000   1.050000 (  1.052998)
sum4  1.180000   0.270000   1.450000 (  1.455063)
sum5  0.690000   0.170000   0.860000 (  0.862998)

sum2が異様に遅かった。
コメントに書いたことが理由だと思う。(まだよくわかりません><)
でも、rubyはブロックの内と外の変数を共有しているから、そんなに色々なことしてないような気がするんだけど…