Не разбивать вещи на несколько приложений. Речь идет не столько о возможности повторного использования, сколько о наличии дюжины моделей и более 100 представлений в одном приложении - чертовски нечитабельно. Кроме того, мне нравится иметь возможность легко сканировать мой файл urls.py, чтобы увидеть, куда указывает URL, когда у меня есть 100 URL, которые становятся все труднее.
Да, копии заданий; просто передачи аргументов нет. Однако вы можете использовать псевдонимы лексики для элементов в @_, используя 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 вместо вспомогательной функции псевдонима немного быстрее.)
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