[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