Class::Accessor::Named

DESCRIPTION

Class::Accessor/Class::Accessor::Fastで作成したサブルーチンにSub::NameHook::LexWrapで名前をつけて、計測可能に。

というのも、Class::Accessorで作成したアクセサはプロファイラなどでは、すべて__ANON__扱いになってしまい、どれがどれだかわからなくなる。

SYNOPSIS

nyuメソッドだけすごいたくさん呼ぶコード

use strict;
use warnings;

package MyClass;
use base qw(Class::Accessor::Fast);
__PACKAGE__->mk_accessors(qw( nyo nyu puu ));


package main;
my $i = MyClass->new;

$i->nyo('nyo');
for (0..100000) {
    $i->nyu('nyu');
}
$i->puu('puu');

これを普通にプロファイラで計測すると

$ perl -d:DProf class_accessor.pl
$ dprofpp
# 〜略〜
 94.1   0.130  0.130 100003   0.0000 0.0000  Class::Accessor::Fast::__ANON__
 21.7   0.030  0.029      4   0.0075 0.0071  main::BEGIN
 7.24   0.010  0.010      1   0.0100 0.0098  MyClass::BEGIN
# 〜略〜

どのアクセサがボトルネックかわからない。
そこで、Class::Accessor::Namedをかましてやると、

$ perl -d:DProf -MClass::Accessor::Named class_accessor.pl
$ dprofpp
# 〜略〜
 43.6   0.060  0.060 100001   0.0000 0.0000  MyClass::nyu
 7.28   0.010  0.010      1   0.0100 0.0099  Hook::LexWrap::Cleanup::BEGIN
 7.28   0.010  0.010      4   0.0025 0.0025  Exporter::as_heavy
 7.28   0.010  0.019      6   0.0016 0.0032  Class::Accessor::Named::BEGIN
 7.28   0.010  0.038      5   0.0020 0.0076  main::BEGIN
# 〜略〜

nyuが呼ばれまくっているのが、わかります。

MEMO

たまに目にするモジュールなのでチェック。あまり利用することはなさそう。ただ実装がコンパクトでかっこいい。