I want to make it easier for people to share benchmarks. It’s not that hard now: you should be able to post the program you wrote, but not many people do that. That might be partly because those programs are ugly, or they are specific to a set-up, or that we don’t have a good way to distribute programs (although we do!).
Last night I created Surveyor::App. I give it a package name and it loads that module, finds all of the subroutines that start with bench_
then benchmarks them.
I started thinking about this after I added a similar feature to Dumbbench. As I messed around with that idea, I worked on a way to also test all of those subroutines at the same time to ensure that they all returned the same thing. I need to ensure that I’m comparing the same thing and the subroutines are doing the same thing.
I took all the boring bits out and reduced my benchmark code to something like this extract of Surveyor::Benchmark::GetDirectoryListing:
package Surveyor::Benchmark::GetDirectoryListing; sub set_up { my( $class, $directory ) = @_; unless( defined $directory ) { require Cwd; $directory = Cwd::cwd(); } die "Directory [$directory] does not exist!\n" unless -e $directory; die "[$directory] does not exist!\n" unless -e $directory; chdir( $directory ) or die "Could not change to $ARGV[0]: $!\n"; my @files = glob( '.* *' ); printf "$directory has %d files\n", scalar @files; } sub tear_down { 1 } sub bench_opendir { opendir my( $dh ), "."; my @f = readdir( $dh ); } sub bench_glob { my @f = glob(".* *") } __PACKAGE__;
Nothing in that code cares what’s handling the particular benchmark since I’ve moved all of that into controller module called by the survey
program:
% survey -p Surveyor::Benchmark::GetDirectoryListing /etc
From there, the normal benchmarking happens for me. If I want to change the backend, the target code shouldn’t have to change.
My intent it that people will write their benchmarks as a module which they can upload to Github or CPAN or wherever, allowing other people to easily run and improve them.
The next step, which I’m not particularly interested in right now, if outputing the run data. I’ve already provided that feature in I added a similar feature to Dumbbench