Это интересная деталь реализации: Создает ли присвоение пустому списку (ненужный) анонимный массив?
Есть два способа ответить на этот вопрос: во-первых, правильный путь: попытаться выяснить, как это может быть обработано в источнике. Существует ли особый случай присвоения пустому списку, вычисляемому в скалярном контексте?
Будучи ленивым и невежественным типом, я решил использовать Benchmark :
#!/usr/bin/perl
use strict; use warnings;
use Benchmark qw( cmpthese );
cmpthese -5, {
goatse => sub { my $n = () = 'A' .. 'Z' },
anon => sub { my $n = @{[ 'A' .. 'Z' ]}},
};
Я запускал тест несколько раз, и назначение пустого списка имело небольшое преимущество во всех случаях. Если бы разница была чисто случайной, то вероятность наблюдения 10 таймингов в пользу козла составляет менее 0,1%, поэтому я предполагаю, что имеется какое-то короткое замыкание.
С другой стороны, тест производительности @daotoad, размещенный в комментариях, вероятно, дает более полную картину:
#!/usr/bin/perl
use strict; use warnings;
use Benchmark qw( cmpthese );
use constant START => 1;
use constant STOP => 1000;
my $start = START;
my $stop = STOP;
cmpthese -5, {
anon => sub { my $n = @{[ $start .. $stop ]}},
goatse => sub { my $n = () = $start .. $stop },
canon => sub { my $n = @{[ START .. STOP ]}},
cgoatse => sub { my $n = () = START .. STOP },
};
Типичные результаты на моем компьютере (Windows XP Pro SP3, Core 2 Duo, 2 ГБ памяти, ActiveState perl
5.10.1.1006):
Rate anon cgoatse goatse canon
anon 5207/s -- -45% -49% -51%
cgoatse 9522/s 83% -- -7% -10%
goatse 10201/s 96% 7% -- -4%
canon 10636/s 104% 12% 4% --
А, с:
use constant START => 'AAAA';
use constant STOP => 'ZZZZ';
результаты:
Rate anon goatse cgoatse canon
anon 1.73/s -- -12% -16% -17%
goatse 1.98/s 14% -- -4% -5%
cgoatse 2.06/s 19% 4% -- -1%
canon 2.08/s 20% 5% 1% --
Вывод:
Если сомневаетесь, используйте my $n = () = ...;