AG
Size: a a a
AG
DF
perl ./t.pl
Rate while_dollar while_n tr m
while_dollar 5.38/s -- -65% -97% -100%
while_n 15.2/s 183% -- -91% -100%
tr 168/s 3013% 1000% -- -100%
m 12233386/s 227191354% 80281496% 7298227% --
AG
AP
DF
DF
my $str = "abc\n" x 1048576;
my $lines;
use Benchmark "cmpthese";
cmpthese -1, {
m => sub {$lines = ($str =~ m/\n/g)},
tr => sub {$lines = ($str =~ tr/\n//)},
while_dollar => sub {$lines = 0; $lines++ while $str =~ m/$/gsm},
while_n => sub {$lines = 0; $lines++ while $str =~ m/\n/gs},
};
DF
$lines = () = $str =~ /m/
, то тут tr быстрееDF
$lines = ($str =~ m/\n/g)
нерабочий, а я думал оптимизаций завезли :(AP
$lines = ($str =~ m/\n/g)
нерабочий, а я думал оптимизаций завезли :(perl -E 'my $str = "abc\n" x 1048576;$lines = ($str =~ m/\n/g); say $lines'
1
AP
=()=
работаетDF
DF
AP
Rate while_dollar m while_n inlinec tr
while_dollar 5.66/s -- -49% -61% -99% -99%
m 11.0/s 94% -- -24% -97% -98%
while_n 14.5/s 157% 32% -- -97% -97%
inlinec 427/s 7438% 3779% 2833% -- -15%
tr 504/s 8797% 4478% 3362% 18% --
AP
DF
AP
AP
use Inline C => <<'END_OF_C_CODE';
int lines_in_string(SV* sv) {
int i, lines = 0;
STRLEN len;
char *ptr;
ptr = SvPV(sv, len);
for(i = 0; i < len; ++i) {
if(ptr[i] == '\n') ++lines;
}
if(len > 0 && ptr[len - 1] != '\n') ++lines;
return lines;
}
END_OF_C_CODE
AP
DF
VO