Class::MOP::Class->add_method()のXS版のベンチマーク

Class::MOP::Class->add_method()のXS版ベンチマーク

Perl/5.8.9 on linux, Class::MOP/0.7
Benchmark for add_method()
For method object
      Rate   pp   xs
pp 20096/s   -- -17%
xs 24093/s  20%   --
For code reference
      Rate   xs   pp
xs  5239/s   -- -58%
pp 12444/s 138%   --

普通に使う(method objectを渡す方)と20%高速になるだけ!?Cygwinの結果とだいぶ違うなあ。もっともこの5.8.9は-DDEBUGGING付きでコンパイルしてあるので,その影響もあるかもしれない。まあそもそも,add_method()のようにメソッド呼び出しの組み合わせがメインであるサブルーチンは,XSで書いてもそれほど高速にはならないものなんだけどね。
ベンチマークコード:

#!perl -w
use strict;
use Class::MOP::Class;
BEGIN{ *Class::MOP::Class::pp_add_method = \&Class::MOP::Class::add_method }
use Class::MOP;
use Benchmark qw(:all);
printf "Perl/%vd on %s, Class::MOP/%s\n", $^V, $^O, Class::MOP->VERSION;
print  "Benchmark for add_method()\n";
{
	package Foo;
	sub foo{ 42 }
}

my $meta = Class::MOP::Class->initialize('Foo');
my $m = $meta->get_method('foo');
print "For method object\n";
cmpthese -1 => {
	pp => sub{
		$meta->pp_add_method(bar => $m);
	},
	xs => sub{
		$meta->add_method(bar => $m);
	},
};

$m = Foo->can('foo');
print "For code reference\n";
cmpthese -1 => {
	pp => sub{
		$meta->pp_add_method(bar => $m);
	},
	xs => sub{
		$meta->add_method(bar => $m);
	},
};
__END__