in reply to Re^2: Numeric Sort for Stringified Value (How to Avoid Warning) (Use the ST)
in thread Numeric Sort for Stringified Value (How to Avoid Warning)

The ST is a bit more complicated, but unless we know what the actual data looks like and how much of it there is, I would hesitate to say it is over-engineered. We encourage people to post minimal examples, so I would not be surprised if the OP simplified the input data.

I am certainly no expert on benchmarking, but my tests yield opposite results. I created arrays containing 5, 10, 20, 40, and 80 elements each and compared our sort routines. I ran the code 5 times and averaged the results. The ST approach was faster in all cases, and the difference increased with the size of the array.

Array size = 5 Rate pg bobf pg 23058/s -32% bobf 33853/s 47% Array size = 10 Rate pg bobf pg 8606/s -51% bobf 17506/s 103% Array size = 20 Rate pg bobf pg 3099/s -64% bobf 8648/s 179% Array size = 40 Rate pg bobf pg 1207/s -71% bobf 4167/s 245% Array size = 80 Rate pg bobf pg 490/s -75% bobf 1987/s 305%

Benchmarking code and complete results:

use warnings; use strict; use Benchmark qw( cmpthese ); my @alpha = ('A' .. 'Z'); for( 0 .. 4 ) { foreach my $size ( 5, 10, 20, 40, 80 ) { my @data; for( 1 .. $size ) { my $num = sprintf( "%.2f", rand( 100 ) ); my $str = $alpha[ rand( @alpha ) ] . $alpha[ rand( @alpha ) ]; push( @data, join( ' ', $num, $str ) ); } print "Array size = $size:\n"; cmpthese( -10, { pg => sub { my @new = sort {(split /\s+/, $b)[0] <=> (split /\s+/, $a)[0]} @data; }, bobf => sub { my @new = map { $_->[0] } sort { $b->[1] <=> $a->[1] } map { [ $_, (split( /\s+/, $_, 2 ))[0] ] + } @data; } } ); print "\n"; } }
Array size = 5: Benchmark: running bobf, pg, each for at least 10 CPU seconds... bobf: 11 wallclock secs (10.48 usr + 0.00 sys = 10.48 CPU) @ 33 +386.84/s (n=350061) pg: 11 wallclock secs (10.64 usr + 0.00 sys = 10.64 CPU) @ 18 +850.48/s (n=200588) Rate pg bobf pg 18850/s -- -44% bobf 33387/s 77% -- Array size = 10: Benchmark: running bobf, pg, each for at least 10 CPU seconds... bobf: 10 wallclock secs (10.50 usr + 0.00 sys = 10.50 CPU) @ 18 +032.86/s (n=189345) pg: 11 wallclock secs (10.28 usr + 0.00 sys = 10.28 CPU) @ 92 +08.44/s (n=94672) Rate pg bobf pg 9208/s -- -49% bobf 18033/s 96% -- Array size = 20: Benchmark: running bobf, pg, each for at least 10 CPU seconds... bobf: 11 wallclock secs (10.44 usr + 0.00 sys = 10.44 CPU) @ 87 +39.61/s (n=91224) pg: 11 wallclock secs (10.78 usr + 0.00 sys = 10.78 CPU) @ 29 +41.38/s (n=31711) Rate pg bobf pg 2941/s -- -66% bobf 8740/s 197% -- Array size = 40: Benchmark: running bobf, pg, each for at least 10 CPU seconds... bobf: 10 wallclock secs (10.27 usr + 0.00 sys = 10.27 CPU) @ 41 +93.57/s (n=43047) pg: 10 wallclock secs (10.47 usr + 0.00 sys = 10.47 CPU) @ 12 +05.27/s (n=12618) Rate pg bobf pg 1205/s -- -71% bobf 4194/s 248% -- Array size = 80: Benchmark: running bobf, pg, each for at least 10 CPU seconds... bobf: 11 wallclock secs (10.58 usr + 0.00 sys = 10.58 CPU) @ 20 +07.66/s (n=21237) pg: 11 wallclock secs (10.75 usr + 0.00 sys = 10.75 CPU) @ 49 +3.86/s (n=5309) Rate pg bobf pg 494/s -- -75% bobf 2008/s 307% -- Array size = 5: Benchmark: running bobf, pg, each for at least 10 CPU seconds... bobf: 11 wallclock secs (10.36 usr + 0.00 sys = 10.36 CPU) @ 33 +305.50/s (n=345045) pg: 11 wallclock secs (10.67 usr + 0.00 sys = 10.67 CPU) @ 19 +336.30/s (n=206357) Rate pg bobf pg 19336/s -- -42% bobf 33306/s 72% -- Array size = 10: Benchmark: running bobf, pg, each for at least 10 CPU seconds... bobf: 9 wallclock secs (10.58 usr + 0.00 sys = 10.58 CPU) @ 17 +641.90/s (n=186616) pg: 11 wallclock secs (10.24 usr + 0.00 sys = 10.24 CPU) @ 90 +41.52/s (n=92540) Rate pg bobf pg 9042/s -- -49% bobf 17642/s 95% -- Array size = 20: Benchmark: running bobf, pg, each for at least 10 CPU seconds... bobf: 11 wallclock secs (10.47 usr + 0.00 sys = 10.47 CPU) @ 86 +70.65/s (n=90773) pg: 11 wallclock secs (10.48 usr + 0.00 sys = 10.48 CPU) @ 31 +57.57/s (n=33104) Rate pg bobf pg 3158/s -- -64% bobf 8671/s 175% -- Array size = 40: Benchmark: running bobf, pg, each for at least 10 CPU seconds... bobf: 11 wallclock secs (10.61 usr + 0.00 sys = 10.61 CPU) @ 42 +42.72/s (n=45011) pg: 11 wallclock secs (10.67 usr + 0.00 sys = 10.67 CPU) @ 12 +56.75/s (n=13412) Rate pg bobf pg 1257/s -- -70% bobf 4243/s 238% -- Array size = 80: Benchmark: running bobf, pg, each for at least 10 CPU seconds... bobf: 11 wallclock secs (10.64 usr + 0.00 sys = 10.64 CPU) @ 19 +67.95/s (n=20941) pg: 11 wallclock secs (10.94 usr + 0.00 sys = 10.94 CPU) @ 47 +1.61/s (n=5158) Rate pg bobf pg 472/s -- -76% bobf 1968/s 317% -- Array size = 5: Benchmark: running bobf, pg, each for at least 10 CPU seconds... bobf: 11 wallclock secs (10.62 usr + 0.00 sys = 10.62 CPU) @ 34 +631.78/s (n=367928) pg: 11 wallclock secs (10.42 usr + 0.00 sys = 10.42 CPU) @ 29 +982.83/s (n=312511) Rate pg bobf pg 29983/s -- -13% bobf 34632/s 16% -- Array size = 10: Benchmark: running bobf, pg, each for at least 10 CPU seconds... bobf: 10 wallclock secs (10.52 usr + 0.00 sys = 10.52 CPU) @ 17 +039.75/s (n=179190) pg: 11 wallclock secs (10.47 usr + 0.00 sys = 10.47 CPU) @ 71 +64.77/s (n=75008) Rate pg bobf pg 7165/s -- -58% bobf 17040/s 138% -- Array size = 20: Benchmark: running bobf, pg, each for at least 10 CPU seconds... bobf: 10 wallclock secs (10.45 usr + 0.00 sys = 10.45 CPU) @ 86 +04.61/s (n=89944) pg: 11 wallclock secs (10.58 usr + 0.02 sys = 10.59 CPU) @ 31 +65.58/s (n=33533) Rate pg bobf pg 3166/s -- -63% bobf 8605/s 172% -- Array size = 40: Benchmark: running bobf, pg, each for at least 10 CPU seconds... bobf: 11 wallclock secs (10.76 usr + 0.00 sys = 10.76 CPU) @ 41 +61.36/s (n=44797) pg: 10 wallclock secs (10.59 usr + 0.00 sys = 10.59 CPU) @ 12 +16.16/s (n=12884) Rate pg bobf pg 1216/s -- -71% bobf 4161/s 242% -- Array size = 80: Benchmark: running bobf, pg, each for at least 10 CPU seconds... bobf: 11 wallclock secs (10.70 usr + 0.00 sys = 10.70 CPU) @ 19 +27.78/s (n=20635) pg: 10 wallclock secs (10.20 usr + 0.00 sys = 10.20 CPU) @ 45 +9.37/s (n=4687) Rate pg bobf pg 459/s -- -76% bobf 1928/s 320% -- Array size = 5: Benchmark: running bobf, pg, each for at least 10 CPU seconds... bobf: 11 wallclock secs (10.48 usr + 0.00 sys = 10.48 CPU) @ 34 +318.68/s (n=359797) pg: 11 wallclock secs (10.56 usr + 0.00 sys = 10.56 CPU) @ 25 +804.60/s (n=272574) Rate pg bobf pg 25805/s -- -25% bobf 34319/s 33% -- Array size = 10: Benchmark: running bobf, pg, each for at least 10 CPU seconds... bobf: 11 wallclock secs (10.64 usr + 0.00 sys = 10.64 CPU) @ 17 +553.24/s (n=186784) pg: 11 wallclock secs (10.48 usr + 0.00 sys = 10.48 CPU) @ 90 +80.60/s (n=95201) Rate pg bobf pg 9081/s -- -48% bobf 17553/s 93% -- Array size = 20: Benchmark: running bobf, pg, each for at least 10 CPU seconds... bobf: 9 wallclock secs (10.38 usr + 0.00 sys = 10.38 CPU) @ 85 +56.82/s (n=88777) pg: 11 wallclock secs (10.55 usr + 0.00 sys = 10.55 CPU) @ 30 +14.60/s (n=31795) Rate pg bobf pg 3015/s -- -65% bobf 8557/s 184% -- Array size = 40: Benchmark: running bobf, pg, each for at least 10 CPU seconds... bobf: 11 wallclock secs (10.58 usr + 0.00 sys = 10.58 CPU) @ 41 +39.91/s (n=43792) pg: 10 wallclock secs (10.38 usr + 0.00 sys = 10.38 CPU) @ 12 +03.28/s (n=12484) Rate pg bobf pg 1203/s -- -71% bobf 4140/s 244% -- Array size = 80: Benchmark: running bobf, pg, each for at least 10 CPU seconds... bobf: 11 wallclock secs (10.47 usr + 0.00 sys = 10.47 CPU) @ 20 +00.29/s (n=20941) pg: 11 wallclock secs (10.86 usr + 0.00 sys = 10.86 CPU) @ 50 +3.08/s (n=5463) Rate pg bobf pg 503/s -- -75% bobf 2000/s 298% -- Array size = 5: Benchmark: running bobf, pg, each for at least 10 CPU seconds... bobf: 11 wallclock secs (10.56 usr + 0.00 sys = 10.56 CPU) @ 33 +619.99/s (n=355128) pg: 11 wallclock secs (10.45 usr + 0.00 sys = 10.45 CPU) @ 21 +314.14/s (n=222818) Rate pg bobf pg 21314/s -- -37% bobf 33620/s 58% -- Array size = 10: Benchmark: running bobf, pg, each for at least 10 CPU seconds... bobf: 11 wallclock secs (10.42 usr + 0.00 sys = 10.42 CPU) @ 17 +261.37/s (n=179898) pg: 11 wallclock secs (10.55 usr + 0.00 sys = 10.55 CPU) @ 85 +35.41/s (n=90023) Rate pg bobf pg 8535/s -- -51% bobf 17261/s 102% -- Array size = 20: Benchmark: running bobf, pg, each for at least 10 CPU seconds... bobf: 11 wallclock secs (10.62 usr + 0.00 sys = 10.62 CPU) @ 86 +64.85/s (n=92064) pg: 10 wallclock secs (10.28 usr + 0.00 sys = 10.28 CPU) @ 32 +16.69/s (n=33074) Rate pg bobf pg 3217/s -- -63% bobf 8665/s 169% -- Array size = 40: Benchmark: running bobf, pg, each for at least 10 CPU seconds... bobf: 11 wallclock secs (10.53 usr + 0.00 sys = 10.53 CPU) @ 40 +94.86/s (n=43123) pg: 11 wallclock secs (10.39 usr + 0.00 sys = 10.39 CPU) @ 11 +54.76/s (n=11998) Rate pg bobf pg 1155/s -- -72% bobf 4095/s 255% -- Array size = 80: Benchmark: running bobf, pg, each for at least 10 CPU seconds... bobf: 11 wallclock secs (10.17 usr + 0.00 sys = 10.17 CPU) @ 20 +28.61/s (n=20635) pg: 11 wallclock secs (10.28 usr + 0.00 sys = 10.28 CPU) @ 52 +3.78/s (n=5385) Rate pg bobf pg 524/s -- -74% bobf 2029/s 287% --

Unless the OP is dealing with large data sets, the time difference is probably negligible. In that case, I'd recommend whatever approach the OP is most comfortable maintaining.

TMTOWTDI. :)