mjd-perl-pm on 11 Jan 2004 05:31:40 -0000 |
> I got a much larger differential than 5%; see below. Something is obviously wrong with your benchmarks. To start with, they claim that on your computer, Perl can sort 9952 items in 3.85 microseconds flat. I find that impossible to believe. Moreover: > 'CODE A' => '@sorted = sort { -M $b <=> -M $a } @filenames;', This code is supposed to be sorting a list of 9952 filenames. You can't do that with fewer than 9951 calls to the comparator, and therefore with fewer than 19,902 -M operations. For a typical set of random data, the comparator is called 120214 times (put '$count++' into the comparator to see this) therefore making 240428 -M operations. Now, according to your benchmark, > CODE A: 39 wallclock secs > (38.50 usr + 0.00 sys = 38.50 CPU) @ 259740.26/s (n000000) the system has taken 0.00 seconds to perform these 19,902 -M's, or maybe it is more like 240428 -M's. That's bullshit. > Note further that, as you predicted, Code D was fractionally faster than > Code B. However, contrary to your prediction, Code B was more than > twice as fast as Code C -- not just 5% faster. No credit or blame attaches to me for predicting or failing to predict the results of your absurd benchmarks. Here's the code I used; the array had 125 entries. $IT = shift || 1000; opendir D, "/tmp" or die; @files = map "/tmp/$_", readdir D; closedir D; print "NULL LOOP\n"; my ($u1, $s1) = times(); my $t1 = $u1 + $s1; for (1..$IT) { 1; } my ($u2, $s2) = times(); my $t2 = $u2 + $s2; my ($ue, $se, $te) = ($u2-$u1, $s2-$s1, $t2-$t1); printf "Elapsed: %6.2fu %6.2fs %6.2ftotal\n", $ue, $se, $te; print "ST\n"; my ($u1, $s1) = times(); my $t1 = $u1 + $s1; for (1..$IT) { my @sorted = map {$_->[0]} sort { $b->[1] <=> $a->[1] } map { [$_, -M $_] } @files; } my ($u2, $s2) = times(); my $t2 = $u2 + $s2; my ($ue, $se, $te) = ($u2-$u1, $s2-$s1, $t2-$t1); printf "Elapsed: %6.2fu %6.2fs %6.2ftotal\n", $ue, $se, $te; print "ST (noblock)\n"; my ($u1, $s1) = times(); my $t1 = $u1 + $s1; for (1..$IT) { my @sorted = map $_->[0], sort { $b->[1] <=> $a->[1] } map [$_, -M $_], @files; } my ($u2, $s2) = times(); my $t2 = $u2 + $s2; my ($ue, $se, $te) = ($u2-$u1, $s2-$s1, $t2-$t1); printf "Elapsed: %6.2fu %6.2fs %6.2ftotal\n", $ue, $se, $te; print "ST (hash)\n"; my ($u1, $s1) = times(); my $t1 = $u1 + $s1; for (1..$IT) { my @sorted = map {$_->{name}} sort { $b->{date} <=> $a->{date} } map { {name => $_, date => -M $_} } @files; } my ($u2, $s2) = times(); my $t2 = $u2 + $s2; my ($ue, $se, $te) = ($u2-$u1, $s2-$s1, $t2-$t1); printf "Elapsed: %6.2fu %6.2fs %6.2ftotal\n", $ue, $se, $te; print "Aux. hash\n"; my ($u1, $s1) = times(); my $t1 = $u1 + $s1; for (1..$IT) { my %date; $date{$_} = -M $_ for @files; my @sorted = sort {$date{$b} <=> $date{$a}} @files; undef %date; } my ($u2, $s2) = times(); my $t2 = $u2 + $s2; my ($ue, $se, $te) = ($u2-$u1, $s2-$s1, $t2-$t1); printf "Elapsed: %6.2fu %6.2fs %6.2ftotal\n", $ue, $se, $te; print "Naive\n"; my ($u1, $s1) = times(); my $t1 = $u1 + $s1; for (1..$IT) { my @sorted = sort {-M $b <=> -M $a} @files; } my ($u2, $s2) = times(); my $t2 = $u2 + $s2; my ($ue, $se, $te) = ($u2-$u1, $s2-$s1, $t2-$t1); printf "Elapsed: %6.2fu %6.2fs %6.2ftotal\n", $ue, $se, $te; Here's a typical output: NULL LOOP Elapsed: 0.00u 0.00s 0.00total ST Elapsed: 8.93u 1.54s 10.47total ST (noblock) Elapsed: 9.08u 1.34s 10.42total ST (hash) Elapsed: 11.14u 2.01s 13.15total Aux. hash Elapsed: 9.77u 1.80s 11.57total Naive Elapsed: 7.19u 12.88s 20.07total - **Majordomo list services provided by PANIX <URL:http://www.panix.com>** **To Unsubscribe, send "unsubscribe phl" to majordomo@lists.pm.org**
|
|