Class::Accessor::Named
DESCRIPTION
Class::Accessor/Class::Accessor::Fastで作成したサブルーチンにSub::NameとHook::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
たまに目にするモジュールなのでチェック。あまり利用することはなさそう。ただ実装がコンパクトでかっこいい。