#!/usr/bin/perl -w use strict; use constant { REAL => 0, USER => 1, SYSTEM=> 2, CHILDREN_USER => 3, CHILDREN_SYSTEM => 4, ITERS => 5, CPU => 5 }; use Benchmark ':hireswallclock'; my %config; &open_config_file; my $test_file = $config{TEST_FILE} || "test.txt"; my $command = $config{PROGRAM} || "sort"; my $first = $config{FIRST}; my $last = $config{LAST}; my $grain = $config{GRAIN}; my $times = $config{TIMES}; my $title = $config{TITLE}; my $inc = $config{INC}; my $output_device = $config{OUTPUT_DEVICE}; my $output_file = $config{OUTPUT_FILE}; my $columns = $config{COLUMNS} || 1; #my $input_generation = $config{GENERATE_INPUT}; my $support_file = $config{SUPPORT_FILE}; require($support_file) if defined($support_file); my $output; my $result; $command = "$command $test_file > $output_device"; print "$title\twall\tcusr\tcsys\tCPU\n"; for(my $size = $first; $size <= $last; $size += $inc) { my $t = $times; until ($t-- == 0) { &generate_input($test_file, $size, $t, $columns); $result = timeit($grain, sub { system($command) }); process_output($size, $result); } } sub process_output { my ($size, $result) = @_; my $iterations = $result->[ITERS] or die "not 6 numbers in benchmark object\n"; my @measures = map {$_/ $iterations} @$result; local $"; $" = "\t"; print_output($size); $measures[CPU] = $measures[CHILDREN_USER]+$measures[CHILDREN_SYSTEM]; splice @measures, USER, 2; my $format = "%5.2f\t" x scalar(@measures); printf "$format\n",@measures; } sub open_config_file { open FILE, ".benchrc" or die "Can't open config file"; while (<FILE>) { if (/\s*(\w+)\s*=\s*"((\\.|[^"])*)"/) { $config{$1} = $2; } elsif (/\s*(\w+)\s*=\s*(\d+)/) { $config{$1} = $2; } } }