Welcome to the Monastery PerlMonks

### RE (tilly) 3: sort performance

by tilly (Archbishop)
 on Sep 12, 2000 at 05:59 UTC Need Help??

in reply to RE: Re (tilly) 1: sort performance

You are right. I just benchmarked it. The overhead of the maps far outweighs the cost of the sort. In fact it is so slow I will have to ask p5p about it. Here is my test:
```use strict;
use Benchmark;
use vars qw(%hash %test);

for (1..1000) {
\$hash{"key\$_"}{this} = "num\$_";
}

%test = (
schwartz => sub {
my @sorted = map \$_->[0],
sort {\$a->[1] cmp \$b->[1]}
map [\$_, \$hash{\$_}{this}], keys %hash;
},
straight => sub {
my @sorted = sort
{ \$hash{\$a}{this} <=> \$hash{\$b}{this} }
keys %hash;
},
stupid => sub {
my @sorted = sort
{
my \$foo = [\$a, \$hash{\$a}{this}];
\$hash{\$a}{this} <=> \$hash{\$b}{this}
} keys %hash;
},
);

timethese (-1, \%test);
Believe it or not, stupid is several times faster for me than schwartz. IMO there is simply no possible good reason for that!

Replies are listed 'Best First'.
RE: RE (tilly) 3: sort performance
by tye (Sage) on Sep 12, 2000 at 07:00 UTC

I suspect that the optimizer is just removing the whole \$foo bit from "stupid" for you.

I was wondering if \$a->[1] would be much faster than \$hash{\$a}{this}. I didn't think it would be by a big enough factor.

If you want raw speed here, create a side array for comparison and sort a list of indices:

```my @list= keys %hash;
my @sort= map { \$hash{\$_}{this} } @list;
my @sorted= @list[
sort { \$sort[\$a] cmp \$sort[\$b] } 0..\$#sort  ];
- tye (but my friends call me "Tye")
I suspected that, but it cannot be because the straight method without that line is much faster, and as you change the \$foo line you see the speed of the stupid sort change.

I suspect a more fundamental issue with how map and grep are implemented, and it should IMO be fixable.

RE (tilly) 4: sort performance
by tilly (Archbishop) on Sep 12, 2000 at 07:42 UTC
When faced with the ridiculous, look for the obvious. If you change all three to use the same kind of sort, Schwartz runs faster than the other two.

*sigh*

(Stupid user tricks.)

I get "schartz" 5%-30% faster than "straight" with "tye" (which you didn't time) being 50%-100% faster still (all using "cmp"). (:

- tye (but my friends call me "Tye")

Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: note [id://32048]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others musing on the Monastery: (5)
As of 2024-09-18 21:02 GMT
Sections?
Information?
Find Nodes?
Leftovers?
Voting Booth?
The PerlMonks site front end has:

Results (25 votes). Check out past polls.

Notices?
 • erzuuli ‥ 🛈The London Perl and Raku Workshop takes place on 26th Oct 2024. If your company depends on Perl, please consider sponsoring and/or attending.