OctaneTest.java revision 1088:7e62d98d4625
1/* 2 * Copyright (c) 2010, 2013, Oracle and/or its affiliates. All rights reserved. 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * This code is free software; you can redistribute it and/or modify it 6 * under the terms of the GNU General Public License version 2 only, as 7 * published by the Free Software Foundation. Oracle designates this 8 * particular file as subject to the "Classpath" exception as provided 9 * by Oracle in the LICENSE file that accompanied this code. 10 * 11 * This code is distributed in the hope that it will be useful, but WITHOUT 12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 14 * version 2 for more details (a copy is included in the LICENSE file that 15 * accompanied this code). 16 * 17 * You should have received a copy of the GNU General Public License version 18 * 2 along with this work; if not, write to the Free Software Foundation, 19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 20 * 21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 22 * or visit www.oracle.com if you need additional information or have any 23 * questions. 24 */ 25 26package jdk.nashorn.internal.performance; 27 28import java.io.BufferedInputStream; 29import java.io.BufferedReader; 30import java.io.ByteArrayInputStream; 31import java.io.ByteArrayOutputStream; 32import java.io.File; 33import java.io.IOException; 34import java.io.InputStream; 35import java.io.InputStreamReader; 36import java.io.PrintStream; 37import java.lang.reflect.Method; 38import java.net.URL; 39import java.text.NumberFormat; 40import java.util.List; 41import org.testng.annotations.Test; 42 43@SuppressWarnings("javadoc") 44public class OctaneTest { 45 46 @Test 47 public void box2DTest() { 48 genericTest("Box2D"); 49 } 50 51 @Test 52 public void codeLoadTest() { 53 genericTest("Code-Load"); 54 } 55 56 @Test 57 public void cryptoTest() { 58 genericTest("Crypto"); 59 } 60 61 @Test 62 public void deltaBlueTest() { 63 genericTest("DeltaBlue"); 64 } 65 66 @Test 67 public void earleyBoyerTest() { 68 genericTest("Earley-Boyer"); 69 } 70 71 @Test 72 public void gbEMUTest() { 73 genericTest("GBEMU"); 74 } 75 76/* @Test 77 public void mandreelTest() { 78 genericTest("Mandreel"); 79 }*/ 80 81 @Test 82 public void navierStokesTest() { 83 genericTest("Navier-Stokes"); 84 } 85 86 @Test 87 public void pdfJSTest() { 88 genericTest("PDFJS"); 89 } 90 91 @Test 92 public void raytraceTest() { 93 genericTest("RayTrace"); 94 } 95 96 @Test 97 public void regexpTest() { 98 genericTest("RegExp"); 99 } 100 101 @Test 102 public void richardsTest() { 103 genericTest("Richards"); 104 } 105 106 @Test 107 public void splayTest() { 108 genericTest("Splay"); 109 } 110 111 @Test 112/* public void typeScriptTest() { 113 genericTest("TypeScript"); 114 } 115 116 @Test 117 public void zlibTest() { 118 genericTest("zlib"); 119 }/*/ 120 121 public void genericTest(final String benchmark) { 122 try { 123 final String mainScript = "test/script/basic/run-octane.js"; 124 final String benchmarkScript = "test/script/external/octane/benchmarks/" + benchmark.toLowerCase() + ".js"; 125 final String[] args = { 126 "--", 127 benchmarkScript, 128 "--verbose" 129 }; 130 final Double score = genericNashornTest(benchmark, mainScript, args); 131 132 Double rhinoScore = null; 133 if (checkRhinoPresence()) { 134 args[0]=mainScript; //rhino does not need this "--" 135 rhinoScore = genericRhinoTest(benchmark, args, System.getProperty("rhino.jar")); 136 } 137 138 Double v8Score = null; 139 if (checkV8Presence()) { 140 v8Score = genericV8Test(benchmark, "test/script/basic/run-octane.js -- test/script/external/octane/benchmarks/" + benchmark.toLowerCase() + ".js --verbose"); 141 } 142 143 generateOutput(benchmark.toLowerCase(), score, rhinoScore, v8Score); 144 145 } catch (final Throwable e) { 146 e.printStackTrace(); 147 } 148 } 149 150 public Double genericNashornTest(final String benchmark, final String testPath, final String[] args) throws Throwable { 151 try { 152 final PerformanceWrapper wrapper = new PerformanceWrapper(); 153 154 final ByteArrayOutputStream baos = new ByteArrayOutputStream(); 155 final PrintStream ps = new PrintStream(baos); 156 157 final java.io.File test=new java.io.File(testPath); 158 final File absoluteFile=test.getAbsoluteFile(); 159 @SuppressWarnings("deprecation") 160 final 161 URL testURL=absoluteFile.toURL(); 162 163 wrapper.runExecuteOnlyTest(testPath, 0, 0, testURL.toString(), ps, System.err, args); 164 165 final byte[] output = baos.toByteArray(); 166 final List<String> result = outputToStrings(output); 167 168 final Double _result = filterBenchmark(result, benchmark); 169 170 return _result; 171 } catch (final Throwable e) { 172 e.printStackTrace(); 173 throw e; 174 } 175 } 176 177 public Double genericRhinoTest(final String benchmark, final String[] testPath, final String jarPath) throws Throwable { 178 179 final PrintStream systemOut = System.out; 180 181 try { 182 final ClassLoader loader = java.net.URLClassLoader.newInstance(new URL[] { new URL(jarPath) }, getClass().getClassLoader()); 183 final Class<?> clazz = Class.forName("org.mozilla.javascript.tools.shell.Main", true, loader); 184 185 final Class<?>[] pars = { String[].class }; 186 final Method mthd = clazz.getMethod("main", pars); 187 188 final ByteArrayOutputStream baos = new ByteArrayOutputStream(); 189 final PrintStream ps = new PrintStream(baos); 190 191 System.setOut(ps); 192 //final String[] realArgs = testPath.split(" ");//{ testPath }; 193 mthd.invoke(null, ((Object)testPath)); 194 System.setOut(systemOut); 195 196 final byte[] output = baos.toByteArray(); 197 final List<String> result = outputToStrings(output); 198 return filterBenchmark(result, benchmark); 199 200 } catch (final Throwable e) { 201 System.setOut(systemOut); 202 e.printStackTrace(); 203 throw e; 204 } 205 } 206 207 public Double genericV8Test(final String benchmark, final String testPath) throws Throwable { 208 209 System.out.println("genericV8Test"); 210 if (!checkV8Presence()) { 211 return null; 212 } 213 final String v8shell = System.getProperty("v8.shell.full.path"); 214 final PrintStream systemOut = System.out; 215 216 try { 217 218 final Process process = Runtime.getRuntime().exec(v8shell + " " + testPath); 219 process.waitFor(); 220 final InputStream processOut = process.getInputStream(); 221 final BufferedInputStream bis = new BufferedInputStream(processOut); 222 223 final byte[] output = new byte[bis.available()]; 224 bis.read(output, 0, bis.available()); 225 final List<String> result = outputToStrings(output); 226 return filterBenchmark(result, benchmark); 227 228 } catch (final Throwable e) { 229 System.setOut(systemOut); 230 e.printStackTrace(); 231 throw e; 232 } 233 } 234 235 protected List<String> outputToStrings(final byte[] output) throws IOException { 236 final ByteArrayInputStream bais = new ByteArrayInputStream(output); 237 final InputStreamReader reader = new InputStreamReader(bais); 238 final BufferedReader bufReader = new BufferedReader(reader); 239 final List<String> list = new java.util.LinkedList<>(); 240 while (bufReader.ready()) { 241 list.add(bufReader.readLine()); 242 } 243 return list; 244 } 245 246 protected Double filterBenchmark(final List<String> output, final String benchmarkName) throws Exception { 247 Double currentScore = 0.; 248 for (final String s : output) { 249 //if (s.trim().startsWith(benchmarkName)) { 250 if (s.trim().startsWith("Score")) { 251 final String[] split = s.split(":"); 252 if (split.length != 2) { 253 for (final String outString : output) { 254 System.out.println("outString (score format)"+outString); 255 } 256 throw new IllegalArgumentException("Invalid benchmark output format"); 257 } 258 259 final NumberFormat nf = NumberFormat.getInstance(); 260 final Number _newCurrentScore = nf.parse(split[1].trim()); 261 final Double newCurrentScore = _newCurrentScore.doubleValue(); 262 if (currentScore < newCurrentScore) { 263 currentScore = newCurrentScore; 264 } 265 } 266 } 267// System.out.println("filterBenchmark current score:"+currentScore); 268 return currentScore; 269 } 270 271 void generateOutput(final String benchmark, final Double nashorn, final Double rhino, final Double v8) throws Exception { 272 Double nashornToRhino = null; 273 Double nashornToV8 = null; 274 if (rhino != null && rhino != 0) { 275 nashornToRhino = nashorn.doubleValue() / rhino.doubleValue(); 276 } 277 if (v8 != null && rhino != 0) { 278 nashornToV8 = nashorn.doubleValue() / v8.doubleValue(); 279 } 280 final String normalizedBenchmark=benchmark.replace("-", ""); 281 System.out.println("benchmark-" + normalizedBenchmark + "-nashorn=" + nashorn); 282 AuroraWrapper.addResults(AuroraWrapper.createOrOpenDocument(), "benchmark-" + normalizedBenchmark + "-nashorn", nashorn.toString()); 283 284 if (rhino != null) { 285 System.out.println("benchmark-" + normalizedBenchmark + "-rhino=" + rhino); 286 AuroraWrapper.addResults(AuroraWrapper.createOrOpenDocument(), "benchmark-" + normalizedBenchmark + "-rhino", rhino.toString()); 287 } 288 if (v8 != null) { 289 AuroraWrapper.addResults(AuroraWrapper.createOrOpenDocument(), "benchmark-" + normalizedBenchmark + "-v8", v8.toString()); 290 } 291 if (nashornToRhino != null) { 292 System.out.println("benchmark-" + normalizedBenchmark + "-nashorn-to-rhino=" + ((float)((int)(nashornToRhino * 100))) / 100); 293 AuroraWrapper.addResults(AuroraWrapper.createOrOpenDocument(), "benchmark-" + normalizedBenchmark + "-nashorn-to-rhino", "" + ((float)((int)(nashornToRhino * 100))) / 100); 294 } 295 if (nashornToV8 != null) { 296 System.out.println("benchmark-" + normalizedBenchmark + "-nashorn-to-v8=" + ((float)((int)(nashornToV8 * 100))) / 100); 297 AuroraWrapper.addResults(AuroraWrapper.createOrOpenDocument(), "benchmark-" + normalizedBenchmark + "-nashorn-to-v8", "" + ((float)((int)(nashornToV8 * 100))) / 100); 298 } 299 } 300 301 boolean checkRhinoPresence() { 302 final String rhinojar = System.getProperty("rhino.jar"); 303 if (rhinojar != null) { 304 // System.out.println("Rhino jar found; performing comparison testing"); 305 return true; 306 } 307 return false; 308 } 309 310 boolean checkV8Presence() { 311 final String v8shell = System.getProperty("v8.shell.full.path"); 312 if (v8shell != null) { 313 // System.out.println("d8 found; performing comparison testing"); 314 return true; 315 } 316 return false; 317 } 318 319} 320