Simple classes for generation accessor methods

Столкнулся с проблемой выбора простого класса для генерации accessors.
Нашел 3 модуля: accessors, Accessor::Fast, Object::Tiny

Все три схожи по функциональности.

Немножко погуглив (google.com & google.com/codesearch) выяснил, что
по сути наиболее часто используем оказался Accessor::Fast
остальные как-то странно мало кто использует

но посмотрев выяснил что плюсы есть как раз у них

accessors
+ удобно использовать с помощю прагмы

Object::Tiny
+ наиболее быстр

Вот и возник вопрос почему так популярен Accessor::Fast ? :)

Вот полные результаты benchmark'a

$ ./test_simple.pl
benchmark new() + get/set
use accessors;
timethis 100000: 2 wallclock secs ( 1.83 usr + 0.01 sys = 1.84 CPU) @ 54347.83/s (n=100000)
use Accessor;
timethis 100000: 3 wallclock secs ( 3.76 usr + 0.01 sys = 3.77 CPU) @ 26525.20/s (n=100000)
use Accessor::Fast;
timethis 100000: 3 wallclock secs ( 2.86 usr + 0.01 sys = 2.87 CPU) @ 34843.21/s (n=100000)
use Accessor::Faster;
timethis 100000: 4 wallclock secs ( 3.74 usr + 0.01 sys = 3.75 CPU) @ 26666.67/s (n=100000)
use Object::Tiny;
timethis 100000: 1 wallclock secs ( 1.00 usr + 0.00 sys = 1.00 CPU) @ 100000.00/s (n=100000)

test_simple.pl

#!/usr/bin/perl
use Benchmark qw(:all);
my $count = 100000;
my $accessors = sub {
require ClassTest::accessors;
my $o = ClassTest::accessors->new();
$o->test('test');
$o->test();
};
my $Accessor = sub {
require ClassTest::Accessor;
my $o = ClassTest::Accessor->new();
$o->test('test');
$o->test();
};
my $AccessorFast = sub {
require ClassTest::AccessorFast;
my $o = ClassTest::AccessorFast->new();
$o->test('test');
$o->test();
};
my $AccessorFaster = sub {
require ClassTest::AccessorFaster;
my $o = ClassTest::AccessorFaster->new();
$o->test('test');
$o->test();
};
my $ObjectTiny = sub {
require ClassTest::ObjectTiny;
my $o = ClassTest::ObjectTiny->new();
$o->test('test');
$o->test();
};
clearallcache();
print "benchmark new() + get/set\n";
print "use accessors;\n";
timethis( $count, $accessors );
clearallcache();
print "use Accessor;\n";
timethis( $count, $Accessor );
clearallcache();
print "use Accessor::Fast;\n";
timethis( $count, $AccessorFast );
clearallcache();
print "use Accessor::Faster;\n";
timethis( $count, $AccessorFaster );
clearallcache();
print "use Object::Tiny;\n";
timethis( $count, $ObjectTiny );
clearallcache();

модули были вида
ClassTest::Accessor

package ClassTest::Accessor;
use base qw( Class::Accessor );
use strict;
use warnings;
use Class::Accessor;
__PACKAGE__->mk_accessors( qw( test ) );
our $VERSION = '0.01';
1;

Все зависит от

Все зависит от того, что именно тебе надо получить. Если тебя интересует только стандартный наборе gettter/setter - Fast рулит.
А если нужно проводить валидацию входных параметров, задавать права доступа(которые он, кажется, просто не умееет), то я бы рекомендовал использовать Class::Accessor.

А вообще, впереди планеты всей прямая запись в кеш:)

Это как раз я

Это как раз я выбирал самый простой, чтобы только accessors и были
про выбор более сложного смотри на форуме http://kiev.pm.org/node/204
там я столкнулся c неоднозначной ситуацией

вот результаты

вот результаты отдельного тестирования вызова new() и get/set

./test_simple2.pl
benchmark new()
timethis 200000: 1 wallclock secs ( 1.01 usr + 0.00 sys = 1.01 CPU) @ 198019.80/s (n=200000)
use Accessor;
timethis 200000: 1 wallclock secs ( 2.51 usr + 0.01 sys = 2.52 CPU) @ 79365.08/s (n=200000)
use Accessor::Fast;
timethis 200000: 3 wallclock secs ( 2.52 usr + 0.00 sys = 2.52 CPU) @ 79365.08/s (n=200000)
use Accessor::Faster;
timethis 200000: 5 wallclock secs ( 4.65 usr + 0.00 sys = 4.65 CPU) @ 43010.75/s (n=200000)
use Object::Tiny;
timethis 200000: 1 wallclock secs ( 0.76 usr + 0.00 sys = 0.76 CPU) @ 263157.89/s (n=200000)
benchmark get/set
use accessors;
timethis 200000: 1 wallclock secs ( 0.50 usr + 0.01 sys = 0.51 CPU) @ 392156.86/s (n=200000)
use Accessor;
timethis 200000: 2 wallclock secs ( 1.69 usr + 0.00 sys = 1.69 CPU) @ 118343.20/s (n=200000)
use Accessor::Fast;
timethis 200000: 1 wallclock secs ( 0.60 usr + 0.00 sys = 0.60 CPU) @ 333333.33/s (n=200000)
use Accessor::Faster;
timethis 200000: 1 wallclock secs ( 0.56 usr + 0.00 sys = 0.56 CPU) @ 357142.86/s (n=200000)
use Object::Tiny;
timethis 200000: 0 wallclock secs ( 0.33 usr + 0.00 sys = 0.33 CPU) @ 606060.61/s (n=200000)
(warning: too few iterations for a reliable count)

Есть еще

Есть еще Accessor::Faster, насколько я помню...