00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031 package org.objectweb.proactive.benchmarks.timit.result;
00032
00033 import java.text.DecimalFormat;
00034 import java.util.Iterator;
00035
00036 import org.jdom.Attribute;
00037 import org.jdom.Document;
00038 import org.jdom.Element;
00039 import org.jdom.filter.ElementFilter;
00040 import org.objectweb.proactive.benchmarks.timit.TimIt;
00041 import org.objectweb.proactive.benchmarks.timit.util.XMLHelper;
00042
00049 public class SerieResultWriter {
00050
00051 private Document document;
00052
00053 private Element eTimit;
00054
00055 private String filename;
00056
00063 public SerieResultWriter( String filename ) {
00064 this.eTimit = new Element("timit");
00065 this.document = new Document(this.eTimit);
00066 this.filename = filename;
00067 }
00068
00072 public Element getRoot() {
00073 return this.eTimit;
00074 }
00075
00090 public void addResult(
00091 Element bResults, String name, int runs, int totalTimeoutErrors ) {
00092 Element benchResult = new Element("FinalStatistics");
00093 this.eTimit.addContent(benchResult);
00094 benchResult.setAttribute(new Attribute("name", name));
00095 benchResult.setAttribute(new Attribute("runs", "" + runs));
00096 benchResult.setAttribute(new Attribute("timeoutErrors", ""
00097 + totalTimeoutErrors));
00098 benchResult.setAttribute(new Attribute("date", ""
00099 + (new java.sql.Timestamp(System.currentTimeMillis()))));
00100
00101
00102 this.fillTimersResults(benchResult, bResults
00103 .getDescendants(new ElementFilter("timers")));
00104
00105
00106 this.fillEventsResults(benchResult, bResults
00107 .getDescendants(new ElementFilter("events")));
00108
00109
00110 this.fillInformations(benchResult);
00111
00112
00113 XMLHelper.writeFile(this.document, this.filename);
00114 }
00115
00116
00117
00118
00119
00120
00121
00122
00127 private void fillTimersResults(Element eTimers, Iterator itTimers) {
00128
00129 Iterator initIterator;
00130 Element temp;
00131
00132 if (!itTimers.hasNext()) {
00133 return;
00134 }
00135
00136
00137 Element eCurrentTimers = (Element) itTimers.next();
00138 Element eCloneTimers = (Element) eCurrentTimers.clone();
00139 eTimers.addContent(eCloneTimers);
00140
00141 initIterator = eCloneTimers.getDescendants();
00142 while (initIterator.hasNext()) {
00143 temp = (Element) initIterator.next();
00144
00145 temp.setAttribute("avg", "0");
00146 temp.setAttribute("max", "0");
00147 temp.setAttribute("dev", "0");
00148 }
00149
00150
00151
00152 double[] tab1 = new double[4];
00153 double[] tab2 = new double[4];
00154 int run = 0;
00155 do {
00156 run++;
00157 Iterator targetIterator = eCurrentTimers.getDescendants();
00158 Iterator finalIterator = eCloneTimers.getDescendants();
00159 while (targetIterator.hasNext() && finalIterator.hasNext()) {
00160 Element e1 = (Element) targetIterator.next();
00161 Element e2 = (Element) finalIterator.next();
00162 if (!e1.getAttributeValue("name").equals(
00163 e2.getAttributeValue("name"))) {
00164 throw new IllegalStateException(
00165 "You are trying to finalize different timers !");
00166 }
00167
00168 tab1[0] = Double.valueOf(e1.getAttributeValue("min"));
00169 tab1[1] = Double.valueOf(e1.getAttributeValue("avg"));
00170 tab1[2] = Double.valueOf(e1.getAttributeValue("max"));
00171
00172 tab2[0] = Double.valueOf(e2.getAttributeValue("min"));
00173 tab2[1] = Double.valueOf(e2.getAttributeValue("avg"));
00174 tab2[2] = Double.valueOf(e2.getAttributeValue("max"));
00175 tab2[3] = Double.valueOf(e2.getAttributeValue("dev"));
00176
00177 if (tab1[0] < tab2[0]) {
00178 tab2[0] = tab1[0];
00179 }
00180
00181 tab2[1] += tab1[1];
00182
00183 if (tab1[2] > tab2[2]) {
00184 tab2[2] = tab1[2];
00185 }
00186
00187 tab2[3] += tab1[1] * tab1[1];
00188
00189 e2.setAttribute("min", "" + tab2[0]);
00190 e2.setAttribute("avg", "" + TimIt.df.format(tab2[1]));
00191 e2.setAttribute("max", "" + tab2[2]);
00192 e2.setAttribute("dev", "" + tab2[3]);
00193 }
00194 if (itTimers.hasNext()) {
00195 eCurrentTimers = (Element) itTimers.next();
00196 } else {
00197 break;
00198 }
00199 } while (true);
00200
00201
00202
00203 double average, deviation, sqrt, childrenSum;
00204 Iterator children;
00205 Iterator finalIterator = eCloneTimers.getDescendants();
00206 while (finalIterator.hasNext()) {
00207 Element e1 = (Element) finalIterator.next();
00208 average = Double.valueOf(e1.getAttributeValue("avg")) / run;
00209 deviation = Double.valueOf(e1.getAttributeValue("dev"));
00210
00211 e1.setAttribute("avg", "" + TimIt.df.format(average));
00212
00213 average = average * average;
00214
00215 sqrt = deviation / run - average;
00216 deviation = Math.sqrt((sqrt > 0) ? sqrt : 0);
00217
00218 e1.setAttribute("dev", "" + TimIt.df.format(deviation));
00219
00220
00221 childrenSum = 0.0;
00222 children = e1.getChildren().iterator();
00223 while (children.hasNext()) {
00224 childrenSum += Double.valueOf(((Element) children.next())
00225 .getAttributeValue("avg"));
00226 }
00227 e1.setAttribute(new Attribute("sum", TimIt.df.format(childrenSum / run)));
00228 }
00229 }
00230
00231
00236 private void fillEventsResults(Element eEvents, Iterator itEvents) {
00237
00238 Iterator initIterator;
00239 Element temp;
00240 DecimalFormat df = TimIt.df;
00241
00242 if (!itEvents.hasNext()) {
00243 return;
00244 }
00245
00246
00247 Element eCurrentEvents = (Element) itEvents.next();
00248 Element eCloneEvents = (Element) eCurrentEvents.clone();
00249 eEvents.addContent(eCloneEvents);
00250
00251 initIterator = eCloneEvents.getChildren().iterator();
00252 while (initIterator.hasNext()) {
00253 temp = (Element) initIterator.next();
00254 try {
00255
00256
00257 Double.valueOf(temp.getValue());
00258 Attribute min = new Attribute("min", "" + Double.MAX_VALUE);
00259 Attribute avg = new Attribute("avg", "0");
00260 Attribute max = new Attribute("max", "" + Double.MIN_VALUE);
00261 Attribute dev = new Attribute("dev", "0");
00262 temp.setAttribute(min);
00263 temp.setAttribute(avg);
00264 temp.setAttribute(max);
00265 temp.setAttribute(dev);
00266
00267 } catch (NumberFormatException e) {
00268
00269 temp.setAttribute( new Attribute(
00270 "value", "Too complex value, first run shown") );
00271 }
00272 }
00273
00274
00275 double fMin, fAvg, fMax, fDev, tValue;
00276 int run = 0;
00277 do {
00278 run++;
00279 Iterator targetIterator = eCurrentEvents
00280 .getDescendants(new ElementFilter("event"));
00281 Iterator finalIterator = eCloneEvents
00282 .getDescendants(new ElementFilter("event"));
00283 while (targetIterator.hasNext() && finalIterator.hasNext()) {
00284 Element e1 = (Element) targetIterator.next();
00285 Element e2 = (Element) finalIterator.next();
00286 if (!e1.getAttributeValue("name").equals(
00287 e2.getAttributeValue("name"))) {
00288 throw new IllegalStateException(
00289 "You are trying to finalize different events !");
00290 }
00291 try {
00292 if (e2.getAttribute("value") == null) {
00293
00294 tValue = Double.valueOf(e1.getValue());
00295 fMin = Double.valueOf(e2.getAttributeValue("min"));
00296 fAvg = Double.valueOf(e2.getAttributeValue("avg"));
00297 fMax = Double.valueOf(e2.getAttributeValue("max"));
00298 fDev = Double.valueOf(e2.getAttributeValue("dev"));
00299
00300
00301 if (tValue < fMin) {
00302 fMin = tValue;
00303 }
00304 fAvg += tValue;
00305 if (tValue > fMax) {
00306 fMax = tValue;
00307 }
00308 fDev += tValue * tValue;
00309
00310
00311 e2.setAttribute("min", "" + df.format(fMin));
00312 e2.setAttribute("avg", "" + df.format(fAvg));
00313 e2.setAttribute("max", "" + df.format(fMax));
00314 e2.setAttribute("dev", "" + df.format(fDev));
00315 }
00316 } catch (NumberFormatException e) {
00317 continue;
00318 }
00319 }
00320 if (itEvents.hasNext()) {
00321 eCurrentEvents = (Element) itEvents.next();
00322 } else {
00323 break;
00324 }
00325 } while (true);
00326
00327
00328
00329 double average, deviation, sqrt;
00330 Iterator finalIterator = eCloneEvents.getChildren().iterator();
00331 while (finalIterator.hasNext()) {
00332 Element e1 = (Element) finalIterator.next();
00333 if (e1.getAttribute("value") == null) {
00334 average = Double.valueOf(e1.getAttributeValue("avg")) / run;
00335 deviation = Double.valueOf(e1.getAttributeValue("dev"));
00336
00337 e1.setAttribute("avg", "" + TimIt.df.format(average));
00338
00339 average = average * average;
00340
00341 sqrt = deviation / run - average;
00342
00343 deviation = Math.sqrt((sqrt > 0) ? sqrt : 0);
00344
00345 e1.setAttribute("dev", "" + TimIt.df.format(deviation));
00346 }
00347 }
00348 }
00349
00354 private void fillInformations( Element benchResults ) {
00355 Element eInfos = new Element("informations");
00356 benchResults.addContent(eInfos);
00357
00358
00359
00360
00361
00362 Element eDeployer = new Element("deployer");
00363 eInfos.addContent(eDeployer);
00364
00365 String jvmVersion = System.getProperty("java.vm.vendor")
00366 + " " + System.getProperty("java.vm.name")
00367 + " " + System.getProperty("java.vm.version")
00368 + " - Version " + System.getProperty("java.version");
00369 eDeployer.setAttribute(new Attribute("jvm",jvmVersion));
00370
00371
00372 String osVersion = System.getProperty("os.arch")
00373 + " " + System.getProperty("os.name")
00374 + " " + System.getProperty("os.version");
00375 eDeployer.setAttribute(new Attribute("os", osVersion));
00376
00377
00378 eDeployer.setAttribute(new Attribute("processors",
00379 ""+Runtime.getRuntime().availableProcessors()));
00380 }
00381 }