From: nobu.nakada@... Date: 2003-08-21T18:07:24+09:00 Subject: [ruby-dev:21217] [PATCH] passing current block なかだです。 現在のブロックを他のメソッドに渡す場合を高速化してみました。 以下のコードで、nested(10)が三倍近く速くなるようです。 require 'benchmark' def dummy end def nested(n, &b) if n > 0 nested(n-1, &b) else dummy(&b) end end ITERATION = 100000 Benchmark.benchmark() do |b| b.report("nested(0) ") {p = proc{}; ITERATION.times{nested(0, &p)}} b.report("nested(1) ") {p = proc{}; ITERATION.times{nested(1, &p)}} b.report("nested(10) ") {p = proc{}; ITERATION.times{nested(10, &p)}} end Index: eval.c =================================================================== RCS file: /cvs/ruby/src/ruby/eval.c,v retrieving revision 1.515 diff -u -2 -p -r1.515 eval.c --- eval.c 14 Aug 2003 17:19:23 -0000 1.515 +++ eval.c 21 Aug 2003 08:53:42 -0000 @@ -7230,4 +7230,11 @@ block_pass(self, node) } + if (ruby_block && ruby_block->block_obj == proc) { + PUSH_ITER(ITER_PRE); + result = rb_eval(self, node->nd_iter); + POP_ITER(); + return result; + } + Data_Get_Struct(proc, struct BLOCK, data); orphan = block_orphan(data); -- --- 僕の前にBugはない。 --- 僕の後ろにBugはできる。 中田 伸悦