sub x {
my @sorted = map $_->[1],
sort{ $a->[0] cmp $b->[0] } map[
$_->title =~ /Manager/ ? 'A'.$_->name : 'B'.$_->name, $_
], @employees;
}
cmpthese( -1, {
obvious => \&obvious,
subtle => \&subtle,
functional => \&functional,
x => \&x,
});
C:\test>junk87
Rate obvious subtle functional x
obvious 183/s -- -18% -60% -83%
subtle 224/s 22% -- -51% -79%
functional 458/s 150% 105% -- -57%
x 1070/s 483% 378% 134% --
With the rise and rise of 'Social' network sites: 'Computers are making people easier to use everyday'
Examine what is said, not who speaks -- Silence betokens consent -- Love the truth but pardon error.
"Science is about questioning the status quo. Questioning authority".
In the absence of evidence, opinion is indistinguishable from prejudice.
RIP Neil Armstrong
| [reply] [Watch: Dir/Any] [d/l] |
Not sure if your computer's architecture is radically different to mine or something, but for me, this technique is still slightly slower than the functional approach, and much slower than keysort.
Results:
Rate obvious subtle pure_schwarz functional sortkey
obvious 133/s -- -28% -60% -65% -80%
subtle 186/s 39% -- -45% -52% -72%
pure_schwarz 337/s 153% 81% -- -12% -50%
functional 383/s 187% 107% 14% -- -43%
sortkey 671/s 403% 262% 99% 75% --
perl -E'sub Monkey::do{say$_,for@_,do{($monkey=[caller(0)]->[3])=~s{::}{ }and$monkey}}"Monkey say"->Monkey::do'
| [reply] [Watch: Dir/Any] [d/l] |
Not sure if your computer's architecture is radically different to mine or something, ...
The first difference I notice is that your fastest iterating solution -- 671/s -- is only half as fast as my fastest iterating solution -- 1100/s.
I seriously doubt my 3 y/o Core2Quad Q6600 @2.4GHz is twice as fast as your hardware.
So the major difference probably comes down to the fact that I couldn't be bothered to install yet another slow-accessor constructor, so I manually code my Person Class:
package Person {
sub new{ my $p = shift; bless { @_ }, $p }
sub name{ $_[0]->{name } }
sub title{ $_[0]->{title} }
}
After that, why your results should be relatively different to mine I have no idea: use v5.14;
use strict;
use warnings;
use List::MoreUtils qw( part );
use Benchmark ':all';
package Person {
sub new{ my $p = shift; bless { @_ }, $p }
sub name{ $_[0]->{name } }
sub title{ $_[0]->{title} }
}
my @employees = map {
Person::->new(
name => int(rand(999999)),
title => int(rand(2))?'Staff':'Manager',
)
} 0..200;
sub obvious {
my @sorted = sort {
if ($a->title =~ /Manager/ and not $b->title =~ /Manager/) {
-1;
}
elsif ($b->title =~ /Manager/ and not $a->title =~ /Manager/)
+{
1;
}
else {
$a->name cmp $b->name;
}
} @employees;
}
sub subtle {
my @sorted = sort {
($a->title !~ /Manager/) - ($b->title !~ /Manager/)
or $a->name cmp $b->name;
} @employees;
}
sub functional {
my @sorted =
map { sort { $a->name cmp $b->name } @$_ }
part { $_->title !~ /Manager/ }
@employees;
}
sub x {
my @sorted = map $_->[1],
sort{ $a->[0] cmp $b->[0] } map[
$_->title =~ /Manager/ ? 'A'.$_->name : 'B'.$_->name, $_
], @employees;
}
cmpthese( -1, {
obvious => \&obvious,
subtle => \&subtle,
functional => \&functional,
x => \&x,
});
But mine are consistent: C:\test>date /t & time/t && junk87
24/10/2012
19:39
Rate obvious subtle functional x
obvious 189/s -- -16% -60% -83%
subtle 226/s 19% -- -52% -80%
functional 471/s 149% 109% -- -57%
x 1101/s 482% 388% 134% --
With the rise and rise of 'Social' network sites: 'Computers are making people easier to use everyday'
Examine what is said, not who speaks -- Silence betokens consent -- Love the truth but pardon error.
"Science is about questioning the status quo. Questioning authority".
In the absence of evidence, opinion is indistinguishable from prejudice.
RIP Neil Armstrong
| [reply] [Watch: Dir/Any] [d/l] [select] |
sub x2 {
my @sorted = keysort {
$_->title =~ /Manager/ ? 'A'.$_->name : 'B'.$_->name
} @employees;
}
With these results: C:\test>junk87
Rate obvious subtle functional x
+x2
obvious 186/s -- -20% -61% -83% -8
+9%
subtle 232/s 24% -- -51% -79% -8
+6%
functional 477/s 156% 106% -- -56% -7
+2%
x 1085/s 483% 368% 127% -- -3
+7%
x2 1717/s 822% 641% 260% 58%
+--
With the rise and rise of 'Social' network sites: 'Computers are making people easier to use everyday'
Examine what is said, not who speaks -- Silence betokens consent -- Love the truth but pardon error.
"Science is about questioning the status quo. Questioning authority".
In the absence of evidence, opinion is indistinguishable from prejudice.
RIP Neil Armstrong
| [reply] [Watch: Dir/Any] [d/l] [select] |