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 |