in reply to Re^6: In-place sort with order assignment
in thread In-place sort with order assignment

Do you see anything wrong with this usage that would prevent the in-place optimisation from kicking in?

Yes, you are allocating the values in @a as numbers, but as you compare then as strings they are converted to strings inside the sort and perl caches the string representation.

A little program to show the effect:

use Devel::Peek; my @a = (1.1, 2.2); print STDERR "allocated as:\n"; Dump \@a; @a = sort { $a <=> $b } @a; print STDERR "\nsorted as numbers:\n"; Dump \@a; @a = sort @a; print STDERR "\nsorted as strings:\n"; Dump \@a;
Under my particular OS/perl combination, stringifying a floating point number, increases its memory usage from 32 to 96 bytes.

A simple (an slow) workaround is to use two auxiliary variables for the comparison:

@a = sort { my ($b, $c) = ($a, $b); $b cmp $c } @a

Replies are listed 'Best First'.
Re^8: In-place sort with order assignment
by BrowserUk (Patriarch) on Sep 20, 2010 at 12:10 UTC

    I should've remembered about that :(