On Sun, Oct 02, 2016 at 11:59:12PM +0300, Niko Tyni wrote:

> It seems to have to do with the size of the input file rather
> than its contents, but I'm not quite sure yet.

It looks like none of the gory regexps are necessary to trigger it.
Here's a short test case, resulting here in

           Rate  concat  assign sprintf
concat   2928/s      --    -94%    -94%
assign  47733/s   1530%      --     -0%
sprintf 47733/s   1530%      0%      --

so showing the 'concat' option has pathologic performance.
It goes away if the length of the base string $s is varied
even slightly, and seems to reappear in 8-byte increments
or decrements. Some of those, like 2**16 - 3, also blow
up the 'sprintf' performance.

The results don't vary much between jessie (Perl 5.20) and sid (5.24)
for me on amd64.

I'll test/bisect this on upstream code next and try to find out if it's
really copy-on-write related or something else.
-- 
Niko Tyni   nt...@debian.org
#!/usr/bin/perl

use strict; 
use warnings; 
use Benchmark 'cmpthese';

my $s =  "A"x (2**16 + 5);
my $cat = 'B' . $s . 'B';
my $spr = sprintf "B%sB", $s;

cmpthese(-1, {
    "assign"  => sub {my $i=0; $s   =~ /./ while $i++ < 100 },
    "concat"  => sub {my $i=0; $cat =~ /./ while $i++ < 100 },
    "sprintf" => sub {my $i=0; $spr =~ /./ while $i++ < 100 },
});

Reply via email to