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

# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements.  See the NOTICE file distributed with
# this work for additional information regarding copyright ownership.
# The ASF licenses this file to You under the Apache License, Version 2.0
# (the "License"); you may not use this file except in compliance with
# the License.  You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

use strict;
use warnings;

use lib '../devel/benchmarks/indexers';
use lib 'devel/benchmarks/indexers';

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

# 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::Lucy->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 );
}