use Benchmark qw{ timethese };
timethese( -2, {
Ordinary => q{
my @results = sort { -M $a <=> -M $b } glob "/bin/*";
},
Schwartzian => q{
map $_->[0],
sort { $a->[1] <=> $b->[1] }
map [$_, -M],
glob "/bin/*";
},
});
####
#!/usr/bin/perl
use strict;
use Benchmark;
$L::glob = "/usr/local/*/*";
@L::files = glob $L::glob;
print "Testing with " . @L::files . " files\n";
my $transform =
q|map $_->[0], sort { $a->[1] <=> $b->[1] } map [ $_, -M ]|;
my $sort = q|sort { -M $a <=> -M $b }|;
my $code = {
assign => q| my @r = @L::files |,
'glob' => q| my @files = glob $L::glob |,
sort_names => q| sort { $a cmp $b } @L::files |,
sort_names_assign => q| my @r = sort { $a cmp $b } @L::files |,
sort_times_assign => q| my @r = $sort @L::files |,
ordinary_orig => qq| my \@r = $sort glob \$L::glob |,
ordinary_mod => qq| my \@r = $sort \@L::files |,
schwartz_orig => qq| $transform, glob \$L::glob |,
schwartz_orig_assign => qq| my \@r = $transform, glob \$L::glob |,
schwartz_mod => qq| my \@r = $transform, \@L::files |,
} ;
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
print "Timing for 2 CPU seconds...\n";
timethese( -2, $code );
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
my $iterations = 1_000;
print "-" x 73, "\n";
print "Timing for $iterations iterations\n";
timethese( $iterations, $code );
##
##
albook_brian[519]$ perl benchmark
Testing with 380 files
Timing for 2 CPU seconds...
Benchmark: running assign, glob, ordinary_mod, ordinary_orig, schwartz_mod, schwartz_orig,
schwartz_orig_assign, sort_names, sort_names_assign for at least 2 CPU seconds...
assign: (2.03 usr + 0.00 sys = 2.03 CPU) (n= 6063)
glob: (0.81 usr + 1.27 sys = 2.08 CPU) (n= 372)
ordinary_mod: (0.46 usr + 1.70 sys = 2.16 CPU) (n= 80)
ordinary_orig: (0.51 usr + 1.64 sys = 2.15 CPU) (n= 66)
schwartz_mod: (1.54 usr + 0.51 sys = 2.05 CPU) (n= 271)
schwartz_orig: (1.06 usr + 1.03 sys = 2.09 CPU) (n= 174)
schwartz_orig_assign: (1.20 usr + 0.87 sys = 2.07 CPU) (n= 156)
sort_names: (2.09 usr + 0.01 sys = 2.10 CPU) (n=3595626)
sort_names_assign: (2.16 usr + 0.00 sys = 2.16 CPU) (n= 5698)
-------------------------------------------------------------------------
Timing for 1000 iterations
Benchmark: timing 1000 iterations of assign, glob, ordinary_mod, ordinary_orig, schwartz_mod,
schwartz_orig, schwartz_orig_assign, sort_names, sort_names_assign...
assign: 1 secs ( 0.33 usr + 0.00 sys = 0.33 CPU)
glob: 6 secs ( 2.31 usr + 3.30 sys = 5.61 CPU)
ordinary_mod: 28 secs ( 5.57 usr + 21.49 sys = 27.06 CPU)
ordinary_orig: 34 secs ( 7.86 usr + 24.74 sys = 32.60 CPU)
schwartz_mod: 8 secs ( 5.12 usr + 2.47 sys = 7.59 CPU)
schwartz_orig: 12 secs ( 6.63 usr + 5.52 sys = 12.15 CPU)
schwartz_orig_assign: 14 secs ( 7.76 usr + 5.41 sys = 13.17 CPU)
sort_names: 0 secs ( 0.00 usr + 0.00 sys = 0.00 CPU)
sort_names_assign: 0 secs ( 0.39 usr + 0.00 sys = 0.39 CPU)
##
##
Benchmark: timing 1000 iterations of glob, ordinary_mod, schwartz_mod, schwartz_orig_assign...
glob: 14 secs ( 6.28 usr + 8.00 sys = 14.28 CPU)
ordinary_mod: 73 secs (14.25 usr + 57.05 sys = 71.30 CPU)
ordinary_orig: 93 secs (20.83 usr + 66.14 sys = 86.97 CPU)
schwartz_mod: 20 secs (14.06 usr + 5.52 sys = 19.58 CPU)
schwartz_orig: 32 secs (17.38 usr + 13.59 sys = 30.97 CPU)
schwartz_orig_assign: 34 secs (19.95 usr + 13.60 sys = 33.55 CPU)
##
##
Benchmark: timing 1000 iterations of glob, ordinary_mod, schwartz_mod, schwartz_orig_assign...
glob: 148 secs ( 31.26 usr + 102.59 sys = 133.85 CPU)
ordinary_mod: 675 secs ( 86.64 usr + 517.19 sys = 603.83 CPU)
ordinary_orig: 825 secs (116.55 usr + 617.62 sys = 734.17 CPU)
schwartz_mod: 151 secs ( 68.88 usr + 67.32 sys = 136.20 CPU)
schwartz_orig: 297 secs ( 89.33 usr + 174.51 sys = 263.84 CPU)
schwartz_orig_assign: 294 secs ( 96.68 usr + 168.76 sys = 265.44 CPU)