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