なかだです。
現在のブロックを他のメソッドに渡す場合を高速化してみました。
以下のコードで、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はできる。
中田 伸悦