なかだです。

現在のブロックを他のメソッドに渡す場合を高速化してみました。

以下のコードで、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はできる。 中田 伸悦