И я сейчас поругаюсь на сфероконечность теста.
Вот бенчмарк на создание объектов и get/set и тут явно видно особенность динамического языка - в зависимости от пакета создающего объекты может очень сильно плавать и скорость создания и скорость доступа:
./test2.pl
benchmark new()
Class::Accessor
timethis 200000: 3 wallclock secs ( 2.50 usr + 0.00 sys = 2.50 CPU) @ 80000.00/s (n=200000)
Class::MakeMethods::Standard::Hash
timethis 200000: 2 wallclock secs ( 1.83 usr + 0.00 sys = 1.83 CPU) @ 109289.62/s (n=200000)
Class::MethodMaker
timethis 200000: 1 wallclock secs ( 0.88 usr + 0.00 sys = 0.88 CPU) @ 227272.73/s (n=200000)
Object::InsideOut
timethis 200000: 94 wallclock secs (88.31 usr + 0.08 sys = 88.39 CPU) @ 2262.70/s (n=200000)
benchmark get/set
Class::Accessor
timethis 200000: 1 wallclock secs ( 1.73 usr + 0.00 sys = 1.73 CPU) @ 115606.94/s (n=200000)
Class::MakeMethods::Standard::Hash
timethis 200000: 1 wallclock secs ( 0.74 usr + 0.01 sys = 0.75 CPU) @ 266666.67/s (n=200000)
Class::Member::HASH
timethis 200000: 6 wallclock secs ( 5.91 usr + 0.00 sys = 5.91 CPU) @ 33840.95/s (n=200000)
Class::MethodMaker
timethis 200000: 1 wallclock secs ( 0.60 usr + 0.00 sys = 0.60 CPU) @ 333333.33/s (n=200000)
Object::InsideOut
timethis 200000: 1 wallclock secs ( 0.58 usr + 0.01 sys = 0.59 CPU) @ 338983.05/s (n=200000)
#!/usr/bin/perl
use Benchmark qw(:all);
require ClassTest::Accessor;
require ClassTest::MakeMethods;
require ClassTest::Member;
require ClassTest::MethodMaker;
require ClassTest::ObjectInsideOut;
my $count = 200000;
my $o_A = ClassTest::Accessor->new();
my $o_MMs = ClassTest::MakeMethods->new();
my $o_M = ClassTest::Member->new();
my $o_MM = ClassTest::MethodMaker->new();
my $o_IO = ClassTest::ObjectInsideOut->new();
clearallcache();
print "benchmark new()\n";
print "Class::Accessor\n";
timethis( $count, sub { my $o = ClassTest::Accessor->new(); } );
clearallcache();
print "Class::MakeMethods::Standard::Hash\n";
timethis( $count, sub { my $o = ClassTest::MakeMethods->new(); } );
clearallcache();
#print "Class::Member::HASH\n";
#timethis( $count, sub { my $o = ClassTest::Member->new(); } );
clearallcache();
print "Class::MethodMaker\n";
timethis( $count, sub { my $o = ClassTest::MethodMaker->new(); } );
clearallcache();
print "Object::InsideOut\n";
timethis( $count, sub { my $o = ClassTest::ObjectInsideOut->new(); } );
clearallcache();
print "benchmark get/set\n";
print "Class::Accessor\n";
timethis( $count, sub { $o_A->test('test'); $o_A->test(); } );
clearallcache();
print "Class::MakeMethods::Standard::Hash\n";
timethis( $count, sub { $o_MMs->test('test'); $o_MMs->test(); } );
clearallcache();
print "Class::Member::HASH\n";
timethis( $count, sub { $o_M->test('test'); $o_M->test(); } );
clearallcache();
print "Class::MethodMaker\n";
timethis( $count, sub { $o_MM->test('test'); $o_MM->test(); } );
clearallcache();
print "Object::InsideOut\n";
timethis( $count, sub { $o_IO->test('test'); $o_IO->test(); } );
clearallcache();