[Moscow.pm] Скорость работы структур.

Alexander Alekseev alex на alemate.ru
Чт Фев 14 05:47:09 PST 2008


 		Hello!

 	Господа, а это нормально, или я чего-то не понимаю:

$uname -a
Linux localhost 2.6.22.12-desktop-1mdv #1 SMP Tue Nov 20 08:38:27 EST 2007 i686 AMD Athlon(tm) 64 X2 Dual Core Processor 4800+ GNU/Linux
$perl --version

This is perl, v5.8.8 built for i386-linux
(with 1 registered patch, see perl -V for more detail)
..

1) берём скрипт:

--------------------------- Cut ----------------------------
use Benchmark;

$count = 5000000;

package tt;

sub new($){
         my $class=shift;
         my $self=[];
         bless $self,$class;
         return $self;
}

sub mmm($) : lvalue{
         shift->[0];
}

sub kkk($) {
         return shift->[0];
}

package main;

timethese($count, {
                 'new'       => sub { my $a=tt->new(); return $a; },
                 'arr'       => sub { my $a=[]; return $a; }
         });

my $A=tt->new();
my $B=[];

sub LLL($){
         return shift->[0];
}
$count=10000000;
timethese($count, {
                 'object_access_lvalue'       => sub { return $A->mmm(); },
                 'object_access_copy'         => sub { return $A->kkk(); },
                 'array ref access'           => sub { return $B->[0]; },
                 'array func access'          => sub { return LLL($B); }
         });

------------------------------------------------------------

2) Запускаем:
$perl tt.pl
Benchmark: timing 5000000 iterations of arr, new...
        arr:  3 wallclock secs ( 3.14 usr + -0.01 sys =  3.13 CPU) @ 1597444.09/s (n=5000000)
        new: 11 wallclock secs (12.14 usr +  0.02 sys = 12.16 CPU) @ 411184.21/s (n=5000000)
Benchmark: timing 10000000 iterations of array func access, array ref access, object_access_copy, object_access_lvalue...
    array func access:  7 wallclock secs ( 7.72 usr +  0.00 sys =  7.72 CPU) @ 1295336.79/s (n=10000000)
    array ref access:  1 wallclock secs ( 1.68 usr +  0.02 sys =  1.70 CPU) @ 5882352.94/s (n=10000000)
    object_access_copy:  9 wallclock secs ( 8.32 usr +  0.01 sys =  8.33 CPU) @ 1200480.19/s (n=10000000)
    object_access_lvalue:  8 wallclock secs ( 8.33 usr +  0.03 sys =  8.36 CPU) @ 1196172.25/s (n=10000000)

Собственно, так и должно быть? Больше всего смущает разница между LLL($B); и $B->[0];

 	Это я тут переписал один скриптик от конструкций $data->{$param1}[$param2][$param3]{$param4}...
к $object->access(...), так скорость в 7 раз и упала. Получается, что даже если просто писать функкции
доступа к данным (бог с ними, с объектами), то скорость всё равно падает катастрофически?
 	Переходим на компиляцию каких-нибудь макросов в перловый код, раз уж сам перл оптимизировать не умеет?

 		Bye. Alex.


Подробная информация о списке рассылки Moscow-pm