The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!/usr/bin/perl
use strict;
use warnings;

use lib 'indexers';

use Getopt::Long;
use Cwd qw( getcwd );
use BenchmarkingIndexer;

# verify that we're running from the right directory;
my $working_dir = getcwd;
die "Must be run from benchmarks/"
    unless $working_dir =~ /benchmarks\W*$/;

# index all docs and run one iter unless otherwise spec'd
my ( $num_reps, $max_to_index, $increment, $store, $build_index );
GetOptions( 
    'reps=s' => \$num_reps, 
    'docs=s' => \$max_to_index,
    'increment=s' => \$increment,
    'store=s'  => \$store,
    'build_index=s' => \$build_index,
);
$num_reps  = 1 unless defined $num_reps;

my $bencher = BenchmarkingIndexer::Plucene->new(
    docs      => $max_to_index,
    increment => $increment,
    store     => $store,
);

if ($build_index) {
    my ( $count, $secs ) = $bencher->build_index;
    print "docs: $count elapsed: $secs\n";
    exit;
}
else {
    $bencher->start_report;

    my @times;
    for my $rep ( 1 .. $num_reps ) {
        # spawn an index-building child process
        my $command = "$^X ";
        # try to figure out if this program was called with -Mblib
        for (@INC) {
            next unless /\bblib\b/;
            # propagate -Mblib to the child
            $command .= "-Mblib ";
            last;
        }
        $command .= "$0 --build_index=1 ";
        $command .= "--docs=$max_to_index " if $max_to_index;
        $command .= "--store=$store " if $store;
        $command .= "--increment=$increment " if $increment;
        my $output = `$command`;

        # extract elapsed time from the output of the child
        $output =~ /^docs: (\d+) elapsed: ([\d.]+)/ 
            or die "no match: '$output'";
        my $docs = $1;
        my $secs = $2;
        push @times, $secs;

        $bencher->print_interim_report( 
            rep => $rep, 
            secs => $secs,
            count => $docs,
        );
    }

    $bencher->print_final_report(\@times);
}