[Moscow.pm] Склеивание строк в perl5.8
Anton Yuzhaninov
citrin на rambler-co.ru
Пт Окт 24 06:06:27 PDT 2008
В perl5.8 есть как минимум три способа из большого количества маленьких строчек собрать одну большую:
- конкатенация
- push в массив и затем склейка через join
- запись в скаляр через PerlIO
Мне было интересно какой из этих методов работает быстрее, и я провел бенчмарк.
Результаты оказались достаточно неочевидные:
Rate array perl io concat
array 132/s -- -30% -46%
perl io 188/s 43% -- -23%
concat 244/s 86% 30% --
Самый простой способ оказался и самым быстрым :)
Код использовался такой:
use Benchmark qw(:hireswallclock cmpthese);
my @test_data = (
'a' x 17,
'b' x 19,
'c' x 23,
'd' x 29,
'e' x 31,
'f' x 37,
'g' x 41,
'h' x 43,
'j' x 47,
);
cmpthese(
3000, {
'concat' => sub {
my $scalar_c = '';
for (my $i=0; $i < 1000; $i++) {
foreach (@test_data) {
$scalar_c .= $_;
}
}
return $scalar_c;
},
'array' => sub {
my @a = ();
for (my $i=0; $i < 1000; $i++) {
foreach (@test_data) {
push @a, $_
}
}
return join '', @a;
},
'perl io' => sub {
my $scalar_io = '';
open(my $fh, '>', \$scalar_io);
for (my $i=0; $i < 1000; $i++) {
foreach (@test_data) {
print $fh $_;
}
}
close $fh;
return $scalar_io;
},
}
);
--
WBR,
Anton Yuzhaninov
Подробная информация о списке рассылки Moscow-pm