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