Мне кажется, что тест не полон без этих вариантов<br>А с ними складывается другая картина<br><br> Rate array array_2 perl io concat perl io_2<br>array 208/s -- -33% -39% -52% -69%<br>
array_2 310/s 49% -- -9% -28% -54%<br>perl io 340/s 63% 10% -- -21% -49%<br>concat 432/s 107% 39% 27% -- -36%<br>perl io_2 673/s 223% 117% 98% 56% --<br>
<br><br>use Benchmark qw(:hireswallclock cmpthese);<br><br>my @test_data = (<br> 'a' x 17,<br> 'b' x 19,<br> 'c' x 23,<br> 'd' x 29,<br> 'e' x 31,<br> 'f' x 37,<br>
'g' x 41,<br> 'h' x 43,<br> 'j' x 47,<br>);<br><br>cmpthese(<br> 3000, {<br> 'concat' => sub {<br> my $scalar_c = '';<br> for (my $i=0; $i < 1000; $i++) {<br>
foreach (@test_data) {<br> $scalar_c .= $_;<br> }<br> }<br> return $scalar_c;<br> },<br> 'array' => sub {<br> my @a = ();<br>
for (my $i=0; $i < 1000; $i++) {<br> foreach (@test_data) {<br> push @a, $_<br> }<br> }<br> return join '', @a;<br> },<br> 'array_2' => sub {<br>
my @a = ();<br> for (my $i=0; $i < 1000; $i++) {<br> push @a, @test_data;<br> }<br> return join '', @a;<br> },<br> 'perl io' => sub {<br>
my $scalar_io = '';<br> open(my $fh, '>', \$scalar_io);<br> for (my $i=0; $i < 1000; $i++) {<br> foreach (@test_data) {<br> print $fh $_;<br>
}<br> }<br> close $fh;<br> return $scalar_io;<br> },<br> 'perl io_2' => sub {<br> my $scalar_io = '';<br> open(my $fh, '>', \$scalar_io);<br>
for (my $i=0; $i < 1000; $i++) {<br> print $fh @test_data;<br> }<br> close $fh;<br> return $scalar_io;<br> },<br> }<br>);<br>