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はブロックの内と外の変数を共有しているから、そんなに色々なことしてないような気がするんだけど…