This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
in-place sort preserved element lvalue identity
authorDavid Mitchell <davem@iabyn.com>
Wed, 10 Aug 2016 15:19:55 +0000 (16:19 +0100)
committerDavid Mitchell <davem@iabyn.com>
Wed, 10 Aug 2016 15:34:04 +0000 (16:34 +0100)
commit45c198c1bc981a507ab719edbd292922a896a397
treeb245a6cb831925b82aa10dd4924b4c341442f4df
parent84721d614eb7d9835d9a09505b0001c7be40a865
in-place sort preserved element lvalue identity

RT #128340

The in-place sorting optimisation @a = sort @a, was preserving the
elements of @a rather than (logically) making copies. So make a copy
of any element whose refcount is greater than 1. This may not be the
perfect condition, but keeps performance for the common cases.

Note that several of the tests in t/op/sort.t actually relied on this
behaviour to test whether the sort was being in-placed, so I've added
tests for in-placing to t/perf/opcount.t instead.

See the previous commit for a general discussion of performance;
to the A, B, C in that commit message, here's a fourth column added:
D is like C but with this commit added:

                     A       B       C       D
                ------  ------  ------  ------
            Ir  5238.0  2324.0  2772.0  2801.0
            Dr  1464.0   649.0   765.0   765.0
            Dw   919.0   298.0   370.0   380.0
          COND   782.0   320.0   405.0   405.0
           IND    25.0    25.0    26.0    26.0

        COND_m    14.9    13.0    17.0    17.1
         IND_m     8.0     5.0     5.0     5.0

so it has little effect on performance.
pp_sort.c
t/op/sort.t
t/perf/opcount.t