1 #!/bin/sh 2 # 3 # CDDL HEADER START 4 # 5 # The contents of this file are subject to the terms 6 # of the Common Development and Distribution License 7 # (the "License"). You may not use this file except 8 # in compliance with the License. 9 # 10 # You can obtain a copy of the license at 11 # src/OPENSOLARIS.LICENSE 12 # or http://www.opensolaris.org/os/licensing. 13 # See the License for the specific language governing 14 # permissions and limitations under the License. 15 # 16 # When distributing Covered Code, include this CDDL 17 # HEADER in each file and include the License file at 18 # usr/src/OPENSOLARIS.LICENSE. If applicable, 19 # add the following below this CDDL HEADER, with the 20 # fields enclosed by brackets "[]" replaced with your 21 # own identifying information: Portions Copyright [yyyy] 22 # [name of copyright owner] 23 # 24 # CDDL HEADER END 25 # 26 27 # 28 # Copyright 2005 Sun Microsystems, Inc. All rights reserved. 29 # Use is subject to license terms. 30 # 31 32 # 33 # output html comparison of several libmicro output data files 34 # usage: multiview file1 file2 file3 file4 ... 35 # 36 # relative ranking is calculated using first as reference 37 # color interpolation is done to indicate relative performance; 38 # the redder the color, the slower the result, the greener the 39 # faster 40 41 /bin/nawk ' BEGIN { 42 benchmark_count = 0; 43 header_count = 0; 44 } 45 /^#/ { 46 continue; 47 } 48 /errors/ { 49 continue; 50 } 51 /^\!/ { 52 split($0, A_header, ":"); 53 name = substr(A_header[1],2); 54 headers[name]=name; 55 header_data[name,FILENAME] = substr($0, length(name) + 3); 56 if (header_names[name] == 0) { 57 header_names[name] = ++header_count; 58 headers[header_count] = name; 59 } 60 continue; 61 } 62 63 { 64 if(NF >= 7) { 65 if (benchmark_names[$1] == 0) { 66 benchmark_names[$1] = ++benchmark_count; 67 benchmarks[benchmark_count] = $1; 68 } 69 if ($6 == 0) 70 benchmark_data[$1,FILENAME] = $4; 71 else 72 benchmark_data[$1,FILENAME] = -1; 73 } 74 } 75 76 END { 77 printf("<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\"\n"); 78 printf("\"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n"); 79 printf("<html xmlns=\"http://www.w3.org/1999/xhtml\">\n"); 80 printf("<head>\n"); 81 printf("<meta http-equiv=\"content-type\" content=\"text/html; charset=ISO-8859-1\" />\n"); 82 printf("<meta name=\"author\" content=\"autogen\" />\n"); 83 printf("<title>multiview comparison</title>\n") 84 printf("<style type=\"text/css\">\n"); 85 printf("body { font-family: sans-serif; }\n"); 86 printf("table { border-collapse: collapse; }\n"); 87 printf("td { padding: 0.1em; border: 1px solid #ccc; text-align: right; }\n"); 88 printf("td.header { text-align: left; }\n"); 89 printf("pre { margin-top: 0em; margin-bottom: 0em; }\n"); 90 printf("</style>\n"); 91 printf("</head>\n"); 92 printf("<body bgcolor=\"#ffffff\" link=\"#0000ee\" vlink=\"#cc0000\" alink=\"#0000ee\">\n"); 93 printf("<table border=\"1\" cellspacing=\"1\">\n"); 94 printf("<tbody>\n"); 95 for(i = 1; i <= header_count; i++) { 96 hname = headers[i]; 97 printf("<tr><td class=\"header\">%s</td>\n", hname); 98 99 for (j = 1; j < ARGC; j++) { 100 sub("^[\t ]+", "", header_data[hname, ARGV[j]]); 101 printf("<td class=\"header\">%s</td>\n", header_data[hname, ARGV[j]]); 102 } 103 printf("</tr>\n"); 104 } 105 printf("<tr>\n"); 106 printf("<th>BENCHMARK</th>\n"); 107 printf("<th align=\"right\">USECS</th>\n"); 108 109 for (i = 2; i < ARGC; i++) 110 printf("<th align=\"right\">USECS [percentage]</th>\n"); 111 112 printf("</tr>\n"); 113 for(i = 1; i < benchmark_count; i++) { 114 for(j = 1; j < benchmark_count; j++) { 115 if (benchmarks[j] > benchmarks[j + 1]) { 116 tmp = benchmarks[j]; 117 benchmarks[j] = benchmarks[j+1]; 118 benchmarks[j+1] = tmp; 119 } 120 } 121 } 122 123 for(i = 1; i <= benchmark_count; i++) { 124 name = benchmarks[i]; 125 a = benchmark_data[name, ARGV[1]]; 126 127 printf("<tr>\n"); 128 printf("<td>%s</td>\n", name); 129 if (a > 0) 130 printf("<td><pre>%f</pre></td>\n", a); 131 else { 132 if (a < 0) 133 printf("<td bgcolor=\"#ff0000\">%s</td>\n", "ERRORS"); 134 else 135 printf("<td>%s</td>\n", "missing"); 136 137 for (j = 2; j < ARGC; j++) 138 printf("<td>%s</td>\n", "not computed"); 139 continue; 140 } 141 142 for (j = 2; j < ARGC; j++) { 143 b = benchmark_data[name, ARGV[j]]; 144 if (b > 0) { 145 factor = b/a; 146 bgcolor = colormap(factor); 147 if (factor > 1) 148 percentage = -(factor * 100 - 100); 149 if (factor <= 1) 150 percentage = 100/factor - 100; 151 152 printf("<td bgcolor=\"%s\"><pre>%11.5f[%#+7.1f%%]</pre></td>\n", 153 bgcolor, b, percentage); 154 } 155 156 else if (b < 0) 157 printf("<td bgcolor=\"#ff0000\">%s</td>\n", "ERRORS"); 158 else 159 printf("<td>%25s</td>\n", "missing"); 160 161 } 162 printf("</tr>\n"); 163 164 } 165 printf("</tbody></table></body></html>\n"); 166 167 } 168 169 function colormap(value, bgcolor, r, g, b) 170 { 171 if (value <= .2) 172 value = .2; 173 if (value > 5) 174 value = 5; 175 176 if (value < .9) { 177 r = colorcalc(.2, value, .9, 0, 255); 178 g = colorcalc(.2, value, .9, 153, 255); 179 b = colorcalc(.2, value, .9, 0, 255); 180 bgcolor=sprintf("#%2.2x%2.2x%2.2x", r, g, b); 181 } 182 else if (value < 1.1) 183 bgcolor="#ffffff"; 184 else { 185 r = 255; 186 g = colorcalc(1.1, value, 5, 255, 0); 187 b = colorcalc(1.1, value, 5, 255, 0); 188 bgcolor=sprintf("#%2.2x%2.2x%2.2x", r, g, b); 189 } 190 191 return (bgcolor); 192 } 193 194 function colorcalc(min, value, max, mincolor, maxcolor) 195 { 196 return((value - min)/(max-min) * (maxcolor-mincolor) + mincolor); 197 } 198 199 ' "$@" 200 201 202