Всякий раз, когда вы думаете об оптимизации этого типа, сделайте профилирование! Результат может быть не тем, что вы ожидаете. Например, я использовал следующий быстрый скрипт, чтобы проверить вашу теорию о том, что предварительное выделение массива происходит быстрее:
for ( my $loops = 0; $loops < 100000; $loops++ )
{
my @arr;
for ( my $foo = 0; $foo < 50; $foo++ ) {
push @arr, 'bar';
}
}
Это заняло 2,13 секунды.
for ( my $loops = 0; $loops < 100000; $loops++ )
{
my @arr;
$arr[49] = 0;
for ( my $foo = 0; $foo < 50; $foo++ ) {
$arr[$foo] = 'bar';
}
}
Это заняло 2,16 секунды (оба теста я запускал несколько раз). Таким образом, на самом деле получается быстрее , чтобы позволить perl обрабатывать выделение массива при необходимости.
Обновление
После внесения изменений, предложенных ysth, числа становятся более понятными: 2,27 секунды для метода «push» и 2,21 для предварительного распределения. Тем не менее, я бы задал вопрос, действительно ли такая оптимизация сэкономит время (разница составляла всего 0,06 секунды после 100 000 итераций).