Front page | perl.perl5.porters |
Postings from October 2016
Re: [perl #127999] Slowdown in split + list assign
Thread Previous
|
Thread Next
From:
Dave Mitchell
Date:
October 21, 2016 15:23
Subject:
Re: [perl #127999] Slowdown in split + list assign
Message ID:
20161021152345.GF3128@iabyn.com
On Fri, Sep 16, 2016 at 11:14:38PM +0100, Dave Mitchell wrote:
> I intend to revisit it soon.
I've now revisited it, with the branch smoke-me/davem/aassign currently
being smoked. It turned out that the slowdown in split between 5.22.0 and
5.24.0 was (mostly) not in fact due to the OPpASSIGN_COMMON_AGG flag being
incorrectly set on the AASSIGN op.
In fact, it's due to a bug fix in 5.24.0. Formerly, the AASSIGN op would
steal the string buffer of RHS temporaries when copying the values. This
failed when the same temporary appeared twice on the RHS, as in e.g.
@a = (split())[0,0]
where split (and other such functions return temporaries). 5.24.0 started
using the SV_NOSTEAL flag for the copy, which give the correct behaviour,
but slowed down many list assignments where the RHS contained strings.
In the branch above I've completely reworked the slurpy part of
pp_aaasign(), with the result that many lists assigns are now much, much
faster (not just than 5.24.0, but much faster than 5.22.0 too).
Benchmarking the two examples in this ticket, using 'perf stat -r 10' to
count CPU cycles:
for my $i (1..300_000) {
my @a = ((split //, "1"x100), "-");
}
5.22.0 11,075,364,115 CPU cycles
5.24.0 15,821,609,317
5.25.5 15,648,800,025
my branch 7,641,656,944
@array_of_strings = qw(stnstntsn stnstnstnstns stnstnstnstn snstnstnstn
ccvdvdvdvzddvd);
for my $i (1..300_000) {
@array = map { split(//, $_), 'separator' } @array_of_strings;
}
5.22.0 12,935,451,207
5.24.0 11,706,821,273
5.25.5 11,233,362,837
my branch 6,091,583,255
And here are some further performance comments taken from the commit message:
Here are the average expr::aassign:: benchmarks for selected perls
(raw numbers - lower is better)
5.6.1 5.22.0 5.24.0 5.25.5 this
------ ------ ------ ------ ------
Ir 1355.9 1497.8 1387.0 1382.0 1146.6
Dr 417.2 454.2 410.1 411.1 335.2
Dw 260.6 270.8 249.0 246.8 194.5
COND 193.5 223.2 212.0 207.7 174.4
IND 25.3 17.6 10.8 10.8 10.0
COND_m 4.1 3.1 3.1 3.7 2.8
IND_m 8.9 6.1 5.5 5.5 5.5
And this code:
my @a;
for my $i (1..10_000_000) {
@a = (1,2,3);
#@a = ();
}
with the empty assign is 33% faster than blead, and without is 12% faster
than blead.
--
"You're so sadly neglected, and often ignored.
A poor second to Belgium, When going abroad."
-- Monty Python, "Finland"
Thread Previous
|
Thread Next