Вы подвергаетесь копирующему данные хиту производительности когда передающие аргументы подпрограммам Perl?

Не разбивать вещи на несколько приложений. Речь идет не столько о возможности повторного использования, сколько о наличии дюжины моделей и более 100 представлений в одном приложении - чертовски нечитабельно. Кроме того, мне нравится иметь возможность легко сканировать мой файл urls.py, чтобы увидеть, куда указывает URL, когда у меня есть 100 URL, которые становятся все труднее.

8
задан FMc 3 July 2010 в 14:25
поделиться

2 ответа

Да, копии заданий; просто передачи аргументов нет. Однако вы можете использовать псевдонимы лексики для элементов в @_, используя Lexical :: Alias ​​. Этот модифицированный тест показывает, что это делается на треть быстрее, чем при использовании ссылки, но стабильно, независимо от длины $ RECORD:

use strict;
use warnings;
use Benchmark qw(timethese);
use Lexical::Alias;

my $RECORD = '0' x 5000000;

my $byVal2loc  = sub { my $v = ByVal2loc( $RECORD, $_) for 0..999 };
my $byRef2loc  = sub { my $v = ByRef2loc(\$RECORD, $_) for 0..999 };
my $byAlias2loc = sub { my $v = ByAlias2loc( $RECORD, $_ ) for 0..999 };

sub ByVal2loc { my $arg = shift; return substr(  $arg, $_[0], 1) }
sub ByRef2loc { my $arg = shift; return substr( $$arg, $_[0], 1) }
sub ByAlias2loc { my $arg; alias($_[0], $arg); return substr( $arg, $_[0], 1  ) }

timethese( $ARGV[0], {
    byVal2loc => $byVal2loc,
    byRef2loc => $byRef2loc,
    byAlias2loc => $byAlias2loc,
} );

# output:
Benchmark: running byAlias2loc, byRef2loc, byVal2loc for at least 3 CPU seconds...
byAlias2loc:  3 wallclock secs ( 3.16 usr +  0.00 sys =  3.16 CPU) @ 430.70/s (n=1361)
 byRef2loc:  4 wallclock secs ( 3.24 usr +  0.00 sys =  3.24 CPU) @ 1329.63/s (n=4308)
 byVal2loc:  5 wallclock secs ( 4.95 usr +  0.01 sys =  4.96 CPU) @  0.40/s (n=2)
            (warning: too few iterations for a reliable count)

(Непосредственное использование alias_r вместо вспомогательной функции псевдонима немного быстрее.)

8
ответ дан 5 December 2019 в 12:12
поделиться

IIRC, в Perl 'sub' массив @_ уже является набором псевдонимов (ссылок) на переменные. Если вы измените $ _ [0] , вы повлияете на переменную в вызывающей функции.

#!/bin/perl -w
use strict;

sub x
{
    print "x = $_[0]\n";
    $_[0] = "pinkerton";
    print "x = $_[0]\n";
}

my $y = "abc";

print "y = $y\n";
x($y);
print "y = $y\n";

Вывод будет:

y = abc
x = abc
x = pinkerton
y = pinkerton
6
ответ дан 5 December 2019 в 12:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: