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__