1bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert#!/usr/local/bin/perl 2bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert 3bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert# ******************************************************************** 4bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert# * COPYRIGHT: 52d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert# * © 2016 and later: Unicode, Inc. and others. 62d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert# * License & terms of use: http://www.unicode.org/copyright.html#License 7bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert# * Copyright (c) 2006, International Business Machines Corporation and 8bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert# * others. All Rights Reserved. 9bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert# ******************************************************************** 10bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert 11bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert 12bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubertuse strict; 13bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert 14bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubertuse Dataset; 15bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert 16bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubertmy $TABLEATTR = 'BORDER="1" CELLPADDING="4" CELLSPACING="0"'; 17bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubertmy $outType = "HTML"; 18bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubertmy $html = "noName"; 19bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubertmy $inTable; 20bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubertmy @headers; 21bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubertmy @timetypes = ("mean per op", "error per op", "events", "per event"); 22bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubertmy %raw; 23bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubertmy $current = ""; 24bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubertmy $exp = 0; 25bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubertmy $mult = 1e9; #use nanoseconds 26bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubertmy $perc = 100; #for percent 27bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubertmy $printEvents = 0; 28bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubertmy $legend = "<a name=\"Legend\">\n<h2>Table legend</h2></a><ul>"; 29bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubertmy $legendDone = 0; 30bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubertmy %options; 31bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubertmy $operationIs = "operation"; 32bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubertmy $eventIs = "event"; 33bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert 34bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubertsub startTest { 35bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert $current = shift; 36bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert $exp = 0; 37bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert outputData($current); 38bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert} 39bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert 40bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubertsub printLeg { 41bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert if(!$legendDone) { 42bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert my $message; 43bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert foreach $message (@_) { 44bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert $legend .= "<li>".$message."</li>\n"; 45bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert } 46bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert } 47bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert} 48bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert 49bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubertsub outputDist { 50bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert my $value = shift; 51bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert my $percent = shift; 52bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert my $mean = $value->getMean; 53bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert my $error = $value->getError; 54bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert print HTML "<td class=\""; 55bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert if($mean > 0) { 56bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert print HTML "value"; 57bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert } else { 58bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert print HTML "worse"; 59bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert } 60bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert print HTML "\">"; 61bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert if($percent) { 62bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert print HTML formatPercent(2, $mean); 63bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert } else { 64bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert print HTML formatNumber(2, $mult, $mean); 65bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert } 66bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert print HTML "</td>\n"; 67bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert print HTML "<td class=\""; 68bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert if((($error*$mult < 10)&&!$percent) || (($error<10)&&$percent)) { 69bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert print HTML "error"; 70bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert } else { 71bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert print HTML "errorLarge"; 72bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert } 73bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert print HTML "\">±"; 74bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert if($percent) { 75bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert print HTML formatPercent(2, $error); 76bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert } else { 77bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert print HTML formatNumber(2, $mult, $error); 78bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert } 79bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert print HTML "</td>\n"; 80bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert} 81bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert 82bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubertsub outputValue { 83bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert my $value = shift; 84bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert print HTML "<td class=\"sepvalue\">"; 85bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert print HTML $value; 86bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert #print HTML formatNumber(2, 1, $value); 87bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert print HTML "</td>\n"; 88bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert} 89bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert 90bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubertsub startTable { 91bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert #my $printEvents = shift; 92bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert $inTable = 1; 93bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert my $i; 94bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert print HTML "<table $TABLEATTR>\n"; 95bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert print HTML "<tbody>\n"; 96bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert if($#headers >= 0) { 97bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert my ($header, $i); 98bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert print HTML "<tr>\n"; 99bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert print HTML "<th rowspan=\"2\" class=\"testNameHeader\"><a href=\"#TestName\">Test Name</a></th>\n"; 100bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert print HTML "<th rowspan=\"2\" class=\"testNameHeader\"><a href=\"#Ops\">Ops</a></th>\n"; 101bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert printLeg("<a name=\"Test Name\">TestName</a> - name of the test as set by the test writer\n", "<a name=\"Ops\">Ops</a> - number of ".$operationIs."s per iteration\n"); 102bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert if(!$printEvents) { 103bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert print HTML "<th colspan=".((4*($#headers+1))-2)." class=\"sourceType\">Per Operation</th>\n"; 104bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert } else { 105bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert print HTML "<th colspan=".((2*($#headers+1))-2)." class=\"sourceType\">Per Operation</th>\n"; 106bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert print HTML "<th colspan=".((5*($#headers+1))-2)." class=\"sourceType\">Per Event</th>\n"; 107bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert } 108bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert print HTML "</tr>\n<tr>\n"; 109bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert if(!$printEvents) { 110bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert foreach $header (@headers) { 111bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert print HTML "<th class=\"source\" colspan=2><a href=\"#meanop_$header\">$header<br>/op</a></th>\n"; 112bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert printLeg("<a name=\"meanop_$header\">$header /op</a> - mean time and error for $header per $operationIs"); 113bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert } 114bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert } 115bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert for $i (1 .. $#headers) { 116bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert print HTML "<th class=\"source\" colspan=2><a href=\"#mean_op_$i\">ratio $i<br>/op</a></th>\n"; 117bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert printLeg("<a name=\"mean_op_$i\">ratio $i /op</a> - ratio and error of per $operationIs time, calculated as: (($headers[0] - $headers[$i])/$headers[$i])*100%, mean value"); 118bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert } 119bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert if($printEvents) { 120bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert foreach $header (@headers) { 121bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert print HTML "<th class=\"source\"><a href=\"#events_$header\">$header<br>events</a></th>\n"; 122bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert printLeg("<a name=\"events_$header\">$header events</a> - number of ".$eventIs."s for $header per iteration"); 123bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert } 124bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert foreach $header (@headers) { 125bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert print HTML "<th class=\"source\" colspan=2><a href=\"#mean_ev_$header\">$header<br>/ev</a></th>\n"; 126bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert printLeg("<a name=\"mean_ev_$header\">$header /ev</a> - mean time and error for $header per $eventIs"); 127bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert } 128bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert for $i (1 .. $#headers) { 129bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert print HTML "<th class=\"source\" colspan=2><a href=\"#mean_ev_$i\">ratio $i<br>/ev</a></th>\n"; 130bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert printLeg("<a name=\"mean_ev_$i\">ratio $i /ev</a> - ratio and error of per $eventIs time, calculated as: (($headers[0] - $headers[$i])/$headers[$i])*100%, mean value"); 131bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert } 132bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert } 133bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert print HTML "</tr>\n"; 134bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert } 135bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert $legendDone = 1; 136bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert} 137bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert 138bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubertsub closeTable { 139bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert if($inTable) { 140bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert undef $inTable; 141bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert print HTML "</tr>\n"; 142bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert print HTML "</tbody>"; 143bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert print HTML "</table>\n"; 144bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert } 145bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert} 146bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert 147bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubertsub newRow { 148bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert if(!$inTable) { 149bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert startTable; 150bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert } else { 151bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert print HTML "</tr>\n"; 152bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert } 153bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert print HTML "<tr>"; 154bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert} 155bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert 156bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubertsub outputData { 157bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert if($inTable) { 158bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert my $msg = shift; 159bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert my $align = shift; 160bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert print HTML "<td"; 161bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert if($align) { 162bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert print HTML " align = $align>"; 163bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert } else { 164bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert print HTML ">"; 165bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert } 166bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert print HTML "$msg"; 167bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert print HTML "</td>"; 168bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert } else { 169bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert my $message; 170bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert foreach $message (@_) { 171bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert print HTML "$message"; 172bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert } 173bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert } 174bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert} 175bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert 176bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubertsub setupOutput { 177bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert my $date = localtime; 178bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert my $options = shift; 179bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert %options = %{ $options }; 180bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert my $title = $options{ "title" }; 181bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert my $headers = $options{ "headers" }; 182bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert if($options{ "operationIs" }) { 183bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert $operationIs = $options{ "operationIs" }; 184bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert } 185bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert if($options{ "eventIs" }) { 186bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert $eventIs = $options{ "eventIs" }; 187bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert } 188bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert @headers = split(/ /, $headers); 189bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert my ($t, $rest); 190bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert ($t, $rest) = split(/\.\w+/, $0); 191bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert $t =~ /^.*\W(\w+)$/; 192bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert $t = $1; 193bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert if($outType eq 'HTML') { 194bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert $html = $date; 195bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert $html =~ s/://g; # ':' illegal 196bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert $html =~ s/\s*\d+$//; # delete year 197bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert $html =~ s/^\w+\s*//; # delete dow 198bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert $html = "$t $html.html"; 199bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert if($options{ "outputDir" }) { 200bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert $html = $options{ "outputDir" }."/".$html; 201bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert } 202bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert $html =~ s/ /_/g; 203bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert 204bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert open(HTML,">$html") or die "Can't write to $html: $!"; 205bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert 206bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert#<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> 207bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert print HTML <<EOF; 208bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert<HTML> 209bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert <HEAD> 210bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> 211bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert <TITLE>$title</TITLE> 212bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert<style> 213bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert<!-- 214bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubertbody { font-size: 10pt; font-family: sans-serif } 215bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubertth { font-size: 10pt; border: 0 solid #000080; padding: 5 } 216bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubertth.testNameHeader { border-width: 1 } 217bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubertth.testName { text-align: left; border-left-width: 1; border-right-width: 1; 218bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert border-bottom-width: 1 } 219bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubertth.source { border-right-width: 1; border-bottom-width: 1 } 220bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubertth.sourceType { border-right-width: 1; border-top-width: 1; border-bottom-width: 1 } 221bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Rouberttd { font-size: 10pt; text-align: Right; border: 0 solid #000080; padding: 5 } 222bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Rouberttd.string { text-align: Left; border-bottom-width:1; border-right-width:1 } 223bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Rouberttd.sepvalue { border-bottom-width: 1; border-right-width: 1 } 224bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Rouberttd.value { border-bottom-width: 1 } 225bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Rouberttd.worse { color: #FF0000; font-weight: bold; border-bottom-width: 1 } 226bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Rouberttd.error { font-size: 75%; border-right-width: 1; border-bottom-width: 1 } 227bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Rouberttd.errorLarge { font-size: 75%; color: #FF0000; font-weight: bold; border-right-width: 1; 228bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert border-bottom-width: 1 } 229bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik RoubertA:link { color: black; font-weight: normal; text-decoration: none} /* unvisited links */ 230bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik RoubertA:visited { color: blue; font-weight: normal; text-decoration: none } /* visited links */ 231bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik RoubertA:hover { color: red; font-weight: normal; text-decoration: none } /* user hovers */ 232bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik RoubertA:active { color: lime; font-weight: normal; text-decoration: none } /* active links */ 233bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert--> 234bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert</style> 235bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert </HEAD> 236bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert <BODY bgcolor="#FFFFFF" LINK="#006666" VLINK="#000000"> 237bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik RoubertEOF 238bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert print HTML "<H1>$title</H1>\n"; 239bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert 240bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert #print HTML "<H2>$TESTCLASS</H2>\n"; 241bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert } 242bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert} 243bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert 244bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubertsub closeOutput { 245bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert if($outType eq 'HTML') { 246bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert if($inTable) { 247bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert closeTable; 248bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert } 249bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert $legend .= "</ul>\n"; 250bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert print HTML $legend; 251bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert outputRaw(); 252bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert print HTML <<EOF; 253bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert </BODY> 254bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert</HTML> 255bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik RoubertEOF 256bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert close(HTML) or die "Can't close $html: $!"; 257bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert } 258bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert} 259bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert 260bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert 261bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubertsub outputRaw { 262bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert print HTML "<h2>Raw data</h2>"; 263bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert my $key; 264bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert my $i; 265bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert my $j; 266bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert my $k; 267bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert print HTML "<table $TABLEATTR>\n"; 268bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert for $key (sort keys %raw) { 269bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert my $printkey = $key; 270bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert $printkey =~ s/\<br\>/ /g; 271bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert if($printEvents) { 272bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert if($key ne "") { 273bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert print HTML "<tr><th class=\"testNameHeader\" colspan = 7>$printkey</td></tr>\n"; # locale and data file 274bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert } 275bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert print HTML "<tr><th class=\"testName\">test name</th><th class=\"testName\">interesting arguments</th><th class=\"testName\">iterations</th><th class=\"testName\">operations</th><th class=\"testName\">mean time (ns)</th><th class=\"testName\">error (ns)</th><th class=\"testName\">events</th></tr>\n"; 276bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert } else { 277bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert if($key ne "") { 278bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert print HTML "<tr><th class=\"testName\" colspan = 6>$printkey</td></tr>\n"; # locale and data file 279bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert } 280bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert print HTML "<tr><th class=\"testName\">test name</th><th class=\"testName\">interesting arguments</th><th class=\"testName\">iterations</th><th class=\"testName\">operations</th><th class=\"testName\">mean time (ns)</th><th class=\"testName\">error (ns)</th></tr>\n"; 281bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert } 282bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert $printkey =~ s/[\<\>\/ ]//g; 283bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert 284bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert my %done; 285bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert for $i ( $raw{$key} ) { 286bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert print HTML "<tr>"; 287bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert for $j ( @$i ) { 288bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert my ($test, $args); 289bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert ($test, $args) = split(/,/, shift(@$j)); 290bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert 291bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert print HTML "<th class=\"testName\">"; 292bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert if(!$done{$test}) { 293bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert print HTML "<a name=\"".$printkey."_".$test."\">".$test."</a>"; 294bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert $done{$test} = 1; 295bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert } else { 296bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert print HTML $test; 297bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert } 298bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert print HTML "</th>"; 299bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert 300bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert print HTML "<td class=\"string\">".$args."</td>"; 301bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert 302bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert print HTML "<td class=\"sepvalue\">".shift(@$j)."</td>"; 303bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert print HTML "<td class=\"sepvalue\">".shift(@$j)."</td>"; 304bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert 305bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert my @data = @{ shift(@$j) }; 306bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert my $ds = Dataset->new(@data); 307bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert print HTML "<td class=\"sepvalue\">".formatNumber(4, $mult, $ds->getMean)."</td><td class=\"sepvalue\">".formatNumber(4, $mult, $ds->getError)."</td>"; 308bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert if($#{ $j } >= 0) { 309bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert print HTML "<td class=\"sepvalue\">".shift(@$j)."</td>"; 310bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert } 311bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert print HTML "</tr>\n"; 312bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert } 313bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert } 314bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert } 315bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert} 316bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert 317bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubertsub store { 318bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert $raw{$current}[$exp++] = [@_]; 319bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert} 320bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert 321bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubertsub outputRow { 322bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert #$raw{$current}[$exp++] = [@_]; 323bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert my $testName = shift; 324bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert my @iterPerPass = @{shift(@_)}; 325bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert my @noopers = @{shift(@_)}; 326bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert my @timedata = @{shift(@_)}; 327bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert my @noevents; 328bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert if($#_ >= 0) { 329bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert @noevents = @{shift(@_)}; 330bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert } 331bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert if(!$inTable) { 332bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert if(@noevents) { 333bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert $printEvents = 1; 334bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert startTable; 335bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert } else { 336bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert startTable; 337bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert } 338bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert } 339bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert debug("No events: @noevents, $#noevents\n"); 340bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert 341bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert my $j; 342bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert my $loc = $current; 343bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert $loc =~ s/\<br\>/ /g; 344bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert $loc =~ s/[\<\>\/ ]//g; 345bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert 346bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert # Finished one row of results. Outputting 347bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert newRow; 348bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert #outputData($testName, "LEFT"); 349bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert print HTML "<th class=\"testName\"><a href=\"#".$loc."_".$testName."\">$testName</a></th>\n"; 350bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert #outputData($iterCount); 351bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert #outputData($noopers[0], "RIGHT"); 352bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert outputValue($noopers[0]); 353bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert 354bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert if(!$printEvents) { 355bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert for $j ( 0 .. $#timedata ) { 356bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert my $perOperation = $timedata[$j]->divideByScalar($iterPerPass[$j]*$noopers[$j]); # time per operation 357bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert #debug("Time per operation: ".formatSeconds(4, $perOperation->getMean, $perOperation->getError)."\n"); 358bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert outputDist($perOperation); 359bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert } 360bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert } 361bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert my $baseLinePO = $timedata[0]->divideByScalar($iterPerPass[0]*$noopers[0]); 362bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert for $j ( 1 .. $#timedata ) { 363bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert my $perOperation = $timedata[$j]->divideByScalar($iterPerPass[$j]*$noopers[$j]); # time per operation 364bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert my $ratio = $baseLinePO->subtract($perOperation); 365bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert $ratio = $ratio->divide($perOperation); 366bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert outputDist($ratio, "%"); 367bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert } 368bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert if (@noevents) { 369bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert for $j ( 0 .. $#timedata ) { 370bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert #outputData($noevents[$j], "RIGHT"); 371bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert outputValue($noevents[$j]); 372bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert } 373bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert for $j ( 0 .. $#timedata ) { 374bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert my $perEvent = $timedata[$j]->divideByScalar($iterPerPass[$j]*$noevents[$j]); # time per event 375bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert #debug("Time per operation: ".formatSeconds(4, $perEvent->getMean, $perEvent->getError)."\n"); 376bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert outputDist($perEvent); 377bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert } 378bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert my $baseLinePO = $timedata[0]->divideByScalar($iterPerPass[0]*$noevents[0]); 379bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert for $j ( 1 .. $#timedata ) { 380bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert my $perOperation = $timedata[$j]->divideByScalar($iterPerPass[$j]*$noevents[$j]); # time per operation 381bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert my $ratio = $baseLinePO->subtract($perOperation); 382bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert $ratio = $ratio->divide($perOperation); 383bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert outputDist($ratio, "%"); 384bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert } 385bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert } 386bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert} 387bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert 388bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert 389bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert1; 390bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert 391bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert#eof 392