1bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert#!/usr/local/bin/perl
2bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert#  ***********************************************************************
3bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert#  * COPYRIGHT:
4bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert#  * Copyright (c) 2002-2006, International Business Machines Corporation
5bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert#  * and others. All Rights Reserved.
6bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert#  ***********************************************************************
7bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
8bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubertuse strict;
9bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
10bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert#use Dataset;
11bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubertuse Format;
12bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubertuse Output;
13bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
14bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubertmy $VERBOSE = 0;
15bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubertmy $DEBUG   = 1;
16bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubertmy $start_l = ""; #formatting help
17bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubertmy $end_l   = "";
18bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubertmy @testArgs; # different kinds of tests we want to do
19bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubertmy $datadir = "data";
20bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubertmy $extraArgs; # stuff that always gets passed to the test program
21bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
22bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
23bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubertmy $iterCount = 0;
24bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubertmy $NUMPASSES = 4;
25bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubertmy $TIME = 2;
26bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubertmy $ITERATIONS;   #Added by Doug
27bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubertmy $DATADIR;
28bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
29bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubertsub setupOptions {
30bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert  my %options = %{shift @_};
31bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
32bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert  if($options{"time"}) {
33bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    $TIME = $options{"time"};
34bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert  }
35bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
36bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert  if($options{"passes"}) {
37bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    $NUMPASSES = $options{"passes"};
38bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert  }
39bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
40bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert  if($options{"dataDir"}) {
41bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    $DATADIR = $options{"dataDir"};
42bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert  }
43bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
44bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert  # Added by Doug
45bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert  if ($options{"iterations"}) {
46bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert  	$ITERATIONS = $options{"iterations"};
47bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert  }
48bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert}
49bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
50bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubertsub runTests {
51bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert  debug("Enter runTest in PerfFramework4j\n");
52bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert  my $options = shift;
53bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert  my @programs;
54bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert  my $tests = shift;
55bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert  my %datafiles;
56bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert  if($#_ >= 0) { # maybe no files/locales
57bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    my $datafiles = shift;
58bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    if($datafiles) {
59bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert      %datafiles = %{$datafiles};
60bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    }
61bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert  }
62bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert  setupOutput($options);
63bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert  setupOptions($options);
64bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
65bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert  my($locale, $iter, $data, $program, $args, $variable);
66bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert#
67bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert#  Outer loop runs through the locales to test
68bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert#
69bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert  if (%datafiles) {
70bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    foreach $locale (sort keys %datafiles ) {
71bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert      foreach $data (@{ $datafiles{$locale} }) {
72bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert	closeTable;
73bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert	my $locdata = "";
74bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert	if(!($locale eq "")) {
75bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert	  $locdata = "<b>Locale:</b> $locale<br>";
76bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert	}
77bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert	$locdata .= "<b>Datafile:</b> $data<br>";
78bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert	startTest($locdata);
79bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
80bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert	if($DATADIR) {
81bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert	  compareLoop ($tests, $locale, $DATADIR."/".$data);
82bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert	} else {
83bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert	  compareLoop ($tests, $locale, $data);
84bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert	}
85bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert      }
86bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    }
87bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert  } else {
88bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    compareLoop($tests);
89bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert  }
90bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert  closeOutput();
91bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert}
92bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
93bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubertsub compareLoop {
94bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert  #debug("enter compareLoop\n");
95bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
96bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert  my $tests = shift;
97bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert  #debug("tests $tests");
98bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert  #my @tests = @{$tests};
99bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert  my %tests = %{$tests};
100bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert  #debug("tests $tests");
101bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert  my $locale = shift;
102bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert  my $datafile = shift;
103bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert  my $locAndData = "";
104bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert  if($locale) {
105bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    $locAndData .= " -L $locale";
106bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert  }
107bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
108bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert  if($datafile) {
109bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    $locAndData .= " -f $datafile";
110bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert  }
111bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
112bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert  my $args;
113bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert  my ($i, $j, $aref);
114bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert  foreach $i ( sort keys %tests ) {
115bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    #debug("Test: $i\n");
116bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    $aref = $tests{$i};
117bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    my @timedata;
118bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    my @iterPerPass;
119bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    my @noopers;
120bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    my @noevents;
121bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
122bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    my $program;
123bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    my @argsAndTest;
124bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    for $j ( 0 .. $#{$aref} ) {
125bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    # first we calibrate. Use time from somewhere
126bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    # first test is used for calibration
127bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    ##################
128bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    #  ($program, @argsAndTest) = split(/\ /, @{ $tests{$i} }[$j]);
129bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    #  #Modified by Doug
130bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    #   my $commandLine;
131bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    #  if ($ITERATIONS) {
132bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    #  	$commandLine = "$program -i $ITERATIONS -p $NUMPASSES $locAndData @argsAndTest";
133bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    #  } else {
134bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    #  	$commandLine = "$program -t $TIME -p $NUMPASSES $locAndData @argsAndTest";
135bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    # 	}
136bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    ######################
137bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    ######################
138bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    my $custArgs;
139bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    my $testCommand = @{ $tests{$i} }[$j];
140bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert      if ($testCommand =~/--/) {
141bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert      	$custArgs = $& . $';	#The matched part and the right part
142bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert      	$testCommand = $`;		#The left part for furthur processing
143bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert      } else { $custArgs = ''; }
144bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert      ($program, @argsAndTest) = split(/\ /, $testCommand);
145bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert      my $commandLine;
146bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert      if ($ITERATIONS) {
147bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert      	$commandLine = "$program @argsAndTest -i $ITERATIONS -p $NUMPASSES $locAndData $custArgs";
148bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert      } else {
149bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert      	$commandLine = "$program @argsAndTest -t $TIME -p $NUMPASSES $locAndData $custArgs";
150bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    	}
151bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    #debug("custArgs:$custArgs\n");
152bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    ####################
153bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
154bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert      my @res = measure1($commandLine);
155bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert      store("$i, $program @argsAndTest", @res);
156bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
157bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert      push(@iterPerPass, shift(@res));
158bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert      push(@noopers, shift(@res));
159bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert      my @data = @{ shift(@res) };
160bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert      if($#res >= 0) {
161bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert	push(@noevents, shift(@res));
162bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert      }
163bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
164bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
165bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert      shift(@data) if (@data > 1); # discard first run
166bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
167bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert      #debug("data is @data\n");
168bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert      my $ds = Dataset->new(@data);
169bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
170bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert      push(@timedata, $ds);
171bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    }
172bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
173bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    outputRow($i, \@iterPerPass, \@noopers, \@timedata, \@noevents);
174bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert  }
175bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
176bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert}
177bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
178bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert#---------------------------------------------------------------------
179bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert# Measure a given test method with a give test pattern using the
180bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert# global run parameters.
181bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert#
182bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert# @param the method to run
183bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert# @param the pattern defining characters to test
184bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert# @param if >0 then the number of iterations per pass.  If <0 then
185bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert#        (negative of) the number of seconds per pass.
186bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert#
187bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert# @return array of:
188bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert#         [0] iterations per pass
189bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert#         [1] events per iteration
190bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert#         [2..] ms reported for each pass, in order
191bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert#
192bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubertsub measure1 {
193bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    # run passes
194bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    my @t = callProg(shift); #"$program $args $argsAndTest");
195bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    my @ms = ();
196bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    my @b; # scratch
197bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    for my $a (@t) {
198bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        # $a->[0]: method name, corresponds to $method
199bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        # $a->[1]: 'begin' data, == $iterCount
200bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        # $a->[2]: 'end' data, of the form <ms> <eventsPerIter>
201bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        # $a->[3...]: gc messages from JVM during pass
202bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        @b = split(/\s+/, $a->[2]);
203bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        #push(@ms, $b[0]);
204bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        push(@ms, shift(@b));
205bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    }
206bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    my $iterCount = shift(@b);
207bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    my $operationsPerIter = shift(@b);
208bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    my $eventsPerIter;
209bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    if($#b >= 0) {
210bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert      $eventsPerIter = shift(@b);
211bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    }
212bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
213bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert#    out("Iterations per pass: $iterCount<BR>\n");
214bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert#    out("Events per iteration: $eventsPerIter<BR>\n");
215bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert#    debug("Iterations per pass: $iterCount<BR>\n");
216bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert#    if($eventsPerIter) {
217bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert#      debug("Events per iteration: $eventsPerIter<BR>\n");
218bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert#    }
219bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
220bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    my @ms_str = @ms;
221bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    $ms_str[0] .= " (discarded)" if (@ms_str > 1);
222bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert#    out("Raw times (ms/pass): ", join(", ", @ms_str), "<BR>\n");
223bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    debug("Raw times (ms/pass): ", join(", ", @ms_str), "<BR>\n");
224bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    if($eventsPerIter) {
225bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert      ($iterCount, $operationsPerIter, \@ms, $eventsPerIter);
226bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    } else {
227bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert      ($iterCount, $operationsPerIter, \@ms);
228bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    }
229bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert}
230bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
231bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
232bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
233bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert#---------------------------------------------------------------------
234bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert# Measure a given test method with a give test pattern using the
235bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert# global run parameters.
236bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert#
237bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert# @param the method to run
238bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert# @param the pattern defining characters to test
239bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert# @param if >0 then the number of iterations per pass.  If <0 then
240bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert#        (negative of) the number of seconds per pass.
241bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert#
242bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert# @return a Dataset object, scaled by iterations per pass and
243bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert#         events per iteration, to give time per event
244bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert#
245bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubertsub measure2 {
246bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    my @res = measure1(@_);
247bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    my $iterPerPass = shift(@res);
248bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    my $operationsPerIter = shift(@res);
249bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    my @data = @{ shift(@res) };
250bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    my $eventsPerIter = shift(@res);
251bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
252bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
253bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    shift(@data) if (@data > 1); # discard first run
254bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
255bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    my $ds = Dataset->new(@data);
256bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    #$ds->setScale(1.0e-3 / ($iterPerPass * $operationsPerIter));
257bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    ($ds, $iterPerPass, $operationsPerIter, $eventsPerIter);
258bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert}
259bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
260bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
261bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert#---------------------------------------------------------------------
262bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert# Invoke program and capture results, passing it the given parameters.
263bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert#
264bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert# @param the method to run
265bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert# @param the number of iterations, or if negative, the duration
266bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert#        in seconds.  If more than on pass is desired, pass in
267bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert#        a string, e.g., "100 100 100".
268bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert# @param the pattern defining characters to test
269bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert#
270bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert# @return an array of results.  Each result is an array REF
271bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert#         describing one pass.  The array REF contains:
272bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert#         ->[0]: The method name as reported
273bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert#         ->[1]: The params on the '= <meth> begin ...' line
274bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert#         ->[2]: The params on the '= <meth> end ...' line
275bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert#         ->[3..]: GC messages from the JVM, if any
276bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert#
277bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubertsub callProg {
278bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    my $cmd = shift;
279bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    #my $pat = shift;
280bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    #my $n = shift;
281bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
282bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    #my $cmd = "java -cp c:\\dev\\myicu4j\\classes $TESTCLASS $method $n $pat";
283bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    debug( "[$cmd]\n"); # for debugging
284bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    open(PIPE, "$cmd|") or die "Can't run \"$cmd\"";
285bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    my @out;
286bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    while (<PIPE>) {
287bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        push(@out, $_);
288bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    }
289bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    close(PIPE) or die "Program failed: \"$cmd\"";
290bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
291bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    @out = grep(!/^\#/, @out);  # filter out comments
292bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
293bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    #debug( "[", join("\n", @out), "]\n");
294bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
295bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    my @results;
296bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    my $method = '';
297bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    my $data = [];
298bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    foreach (@out) {
299bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        next unless (/\S/);
300bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
301bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        if (/^=\s*(\w+)\s*(\w+)\s*(.*)/) {
302bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert            my ($m, $state, $d) = ($1, $2, $3);
303bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert            #debug ("$_ => [[$m $state !!!$d!!! $data ]]\n");
304bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert            if ($state eq 'begin') {
305bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                die "$method was begun but not finished" if ($method);
306bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                $method = $m;
307bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                push(@$data, $d);
308bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                push(@$data, ''); # placeholder for end data
309bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert            } elsif ($state eq 'end') {
310bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                if ($m ne $method) {
311bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    die "$method end does not match: $_";
312bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                }
313bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                $data->[1] = $d; # insert end data at [1]
314bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                #debug( "#$method:", join(";",@$data), "\n");
315bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                unshift(@$data, $method); # add method to start
316bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                push(@results, $data);
317bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                $method = '';
318bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                $data = [];
319bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert            } else {
320bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                die "Can't parse: $_";
321bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert            }
322bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        }
323bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
324bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        elsif (/^\[/) {
325bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert            if ($method) {
326bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                push(@$data, $_);
327bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert            } else {
328bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                # ignore extraneous GC notices
329bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert            }
330bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        }
331bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
332bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        else {
333bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert            die "Can't parse: $_";
334bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        }
335bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    }
336bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
337bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    die "$method was begun but not finished" if ($method);
338bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
339bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    @results;
340bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert}
341bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
342bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubertsub debug  {
343bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert  my $message;
344bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert  if($DEBUG != 0) {
345bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    foreach $message (@_) {
346bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert      print STDERR "$message";
347bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    }
348bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert  }
349bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert}
350bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
351bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubertsub measure1Alan {
352bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert  #Added here, was global
353bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert  my $CALIBRATE = 2; # duration in seconds for initial calibration
354bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
355bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    my $method = shift;
356bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    my $pat = shift;
357bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    my $iterCount = shift; # actually might be -seconds/pass
358bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
359bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    out("<P>Measuring $method using $pat, ");
360bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    if ($iterCount > 0) {
361bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        out("$iterCount iterations/pass, $NUMPASSES passes</P>\n");
362bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    } else {
363bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        out(-$iterCount, " seconds/pass, $NUMPASSES passes</P>\n");
364bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    }
365bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
366bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    # is $iterCount actually -seconds?
367bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    if ($iterCount < 0) {
368bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
369bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        # calibrate: estimate ms/iteration
370bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        print "Calibrating...";
371bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        my @t = callJava($method, $pat, -$CALIBRATE);
372bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        print "done.\n";
373bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
374bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        my @data = split(/\s+/, $t[0]->[2]);
375bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        my $timePerIter = 1.0e-3 * $data[0] / $data[2];
376bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
377bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        # determine iterations/pass
378bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        $iterCount = int(-$iterCount / $timePerIter + 0.5);
379bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
380bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        out("<P>Calibration pass ($CALIBRATE sec): ");
381bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        out("$data[0] ms, ");
382bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        out("$data[2] iterations = ");
383bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        out(formatSeconds(4, $timePerIter), "/iteration<BR>\n");
384bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    }
385bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
386bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    # run passes
387bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    print "Measuring $iterCount iterations x $NUMPASSES passes...";
388bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    my @t = callJava($method, $pat, "$iterCount " x $NUMPASSES);
389bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    print "done.\n";
390bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    my @ms = ();
391bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    my @b; # scratch
392bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    for my $a (@t) {
393bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        # $a->[0]: method name, corresponds to $method
394bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        # $a->[1]: 'begin' data, == $iterCount
395bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        # $a->[2]: 'end' data, of the form <ms> <eventsPerIter>
396bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        # $a->[3...]: gc messages from JVM during pass
397bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        @b = split(/\s+/, $a->[2]);
398bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        push(@ms, $b[0]);
399bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    }
400bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    my $eventsPerIter = $b[1];
401bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
402bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    out("Iterations per pass: $iterCount<BR>\n");
403bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    out("Events per iteration: $eventsPerIter<BR>\n");
404bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
405bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    my @ms_str = @ms;
406bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    $ms_str[0] .= " (discarded)" if (@ms_str > 1);
407bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    out("Raw times (ms/pass): ", join(", ", @ms_str), "<BR>\n");
408bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
409bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    ($iterCount, $eventsPerIter, @ms);
410bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert}
411bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
412bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
413bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert1;
414bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
415bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert#eof
416