[Moscow.pm] Perl Socket application

Eugene Kaltashkin zhecka на gmail.com
Сб Ноя 10 09:05:09 PST 2007


> use constant плох тем, что ему нужны barewords. Readonly манипулирует
> обычными лексическими переменными.
>
> Второе отличие - ограничение области видимости:
>
>    do {
>       use constant PM => 'Moscow 1.0';
>    };
>    print PM; # печатается без вопросов
>
>    do {
>       use Readonly;
>       Readonly my $group => 'Moscow 2.0';
>    };
>    print $group; # Use of uninitialized value in print

хм. на самом деле всё очень грустно.

use Benchmark qw( cmpthese ) ;
use Readonly;

my $xy = 3;
Readonly my $xx => 3;
use constant XY => 3;
sub XX() { 3 }

cmpthese( 5000000, {
simplevar => sub{my $a=$xy**2}
} );
cmpthese( 5000000, {
readonlyvar => sub{my $a=$xx**2}
} );
cmpthese( 5000000, {
constant => sub{my $a=XY**2}
} );
cmpthese( 5000000, {
subfunc => sub{my $a=XX**2}
} );


simplevar 734788/s        --
readonlyvar 71902/s          --
constant 1441441/s       --
subfunc 1447964/s      --

Вроде как subfunc выигрывает.
Ниже сравнительный benchmark для разных переменных разных типов.
Тупое присвоение было совсем не интересно, решил наложить на разные
типы данных regexp.
вот что получилось.

readonlystr_rovar    25549/s
readonlystr_constvar 35955/s
readonlystr_subvar   36158/s
readonlystr_var      36261/s
subfuncstr_rovar     36261/s
constantstr_rovar    36364/s
simplestr_rovar      36364/s
simplestr_constvar   77576/s
subfuncstr_var       77576/s
simplestr_subvar     77576/s
subfuncstr_subvar    78049/s
simplestr_var        78049/s
subfuncstr_constvar  78049/s
constantstr_subvar   80503/s
constantstr_var      80503/s
constantstr_constvar 81529/s

вызов был вот такого вида.
STRING_VAR => sub{my $a = reg(STRING,VAR);},
sub reg
{
my $a = shift;
my $r = shift;
$a =~ s/$r//;
return $a;
}

что самое интересное, обычные переменные определенные как my $var,
ненамного медленнее чем constant, чего не скажешь о readonly.




-- 
Best Regards
ZHECKA-RIPN


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