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 "\">&plusmn;";
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