blob: 102ffc1a53187009a0fc9a431d090c490f94d8b3 [file] [log] [blame]
/*
* Copyright (c) 2010, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Oracle designates this
* particular file as subject to the "Classpath" exception as provided
* by Oracle in the LICENSE file that accompanied this code.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
package jdk.nashorn.internal.performance;
import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.lang.reflect.Method;
import java.net.URL;
import java.text.NumberFormat;
import java.util.List;
import org.testng.annotations.Test;
@SuppressWarnings("javadoc")
public class OctaneTest {
@Test
public void box2DTest() {
genericTest("Box2D");
}
@Test
public void codeLoadTest() {
genericTest("Code-Load");
}
@Test
public void cryptoTest() {
genericTest("Crypto");
}
@Test
public void deltaBlueTest() {
genericTest("DeltaBlue");
}
@Test
public void earleyBoyerTest() {
genericTest("Earley-Boyer");
}
@Test
public void gbEMUTest() {
genericTest("GBEMU");
}
/* @Test
public void mandreelTest() {
genericTest("Mandreel");
}*/
@Test
public void navierStokesTest() {
genericTest("Navier-Stokes");
}
@Test
public void pdfJSTest() {
genericTest("PDFJS");
}
@Test
public void raytraceTest() {
genericTest("RayTrace");
}
@Test
public void regexpTest() {
genericTest("RegExp");
}
@Test
public void richardsTest() {
genericTest("Richards");
}
@Test
public void splayTest() {
genericTest("Splay");
}
@Test
/* public void typeScriptTest() {
genericTest("TypeScript");
}
@Test
public void zlibTest() {
genericTest("zlib");
}/*/
public void genericTest(final String benchmark) {
try {
final String mainScript = "test/script/basic/run-octane.js";
final String benchmarkScript = "test/script/external/octane/benchmarks/" + benchmark.toLowerCase() + ".js";
final String[] args = {
"--",
benchmarkScript,
"--verbose"
};
final Double score = genericNashornTest(benchmark, mainScript, args);
Double rhinoScore = null;
if (checkRhinoPresence()) {
args[0]=mainScript; //rhino does not need this "--"
rhinoScore = genericRhinoTest(benchmark, args, System.getProperty("rhino.jar"));
}
Double v8Score = null;
if (checkV8Presence()) {
v8Score = genericV8Test(benchmark, "test/script/basic/run-octane.js -- test/script/external/octane/benchmarks/" + benchmark.toLowerCase() + ".js --verbose");
}
generateOutput(benchmark.toLowerCase(), score, rhinoScore, v8Score);
} catch (final Throwable e) {
e.printStackTrace();
}
}
public Double genericNashornTest(final String benchmark, final String testPath, final String[] args) throws Throwable {
try {
final PerformanceWrapper wrapper = new PerformanceWrapper();
final ByteArrayOutputStream baos = new ByteArrayOutputStream();
final PrintStream ps = new PrintStream(baos);
final java.io.File test=new java.io.File(testPath);
final File absoluteFile=test.getAbsoluteFile();
@SuppressWarnings("deprecation")
final
URL testURL=absoluteFile.toURL();
wrapper.runExecuteOnlyTest(testPath, 0, 0, testURL.toString(), ps, System.err, args);
final byte[] output = baos.toByteArray();
final List<String> result = outputToStrings(output);
final Double _result = filterBenchmark(result, benchmark);
return _result;
} catch (final Throwable e) {
e.printStackTrace();
throw e;
}
}
public Double genericRhinoTest(final String benchmark, final String[] testPath, final String jarPath) throws Throwable {
final PrintStream systemOut = System.out;
try {
final ClassLoader loader = java.net.URLClassLoader.newInstance(new URL[] { new URL(jarPath) }, getClass().getClassLoader());
final Class<?> clazz = Class.forName("org.mozilla.javascript.tools.shell.Main", true, loader);
final Class<?>[] pars = { String[].class };
final Method mthd = clazz.getMethod("main", pars);
final ByteArrayOutputStream baos = new ByteArrayOutputStream();
final PrintStream ps = new PrintStream(baos);
System.setOut(ps);
//final String[] realArgs = testPath.split(" ");//{ testPath };
mthd.invoke(null, ((Object)testPath));
System.setOut(systemOut);
final byte[] output = baos.toByteArray();
final List<String> result = outputToStrings(output);
return filterBenchmark(result, benchmark);
} catch (final Throwable e) {
System.setOut(systemOut);
e.printStackTrace();
throw e;
}
}
public Double genericV8Test(final String benchmark, final String testPath) throws Throwable {
System.out.println("genericV8Test");
if (!checkV8Presence()) {
return null;
}
final String v8shell = System.getProperty("v8.shell.full.path");
final PrintStream systemOut = System.out;
try {
final Process process = Runtime.getRuntime().exec(v8shell + " " + testPath);
process.waitFor();
final InputStream processOut = process.getInputStream();
final BufferedInputStream bis = new BufferedInputStream(processOut);
final byte[] output = new byte[bis.available()];
bis.read(output, 0, bis.available());
final List<String> result = outputToStrings(output);
return filterBenchmark(result, benchmark);
} catch (final Throwable e) {
System.setOut(systemOut);
e.printStackTrace();
throw e;
}
}
protected List<String> outputToStrings(final byte[] output) throws IOException {
final ByteArrayInputStream bais = new ByteArrayInputStream(output);
final InputStreamReader reader = new InputStreamReader(bais);
final BufferedReader bufReader = new BufferedReader(reader);
final List<String> list = new java.util.LinkedList<>();
while (bufReader.ready()) {
list.add(bufReader.readLine());
}
return list;
}
protected Double filterBenchmark(final List<String> output, final String benchmarkName) throws Exception {
Double currentScore = 0.;
for (final String s : output) {
//if (s.trim().startsWith(benchmarkName)) {
if (s.trim().startsWith("Score")) {
final String[] split = s.split(":");
if (split.length != 2) {
for (final String outString : output) {
System.out.println("outString (score format)"+outString);
}
throw new IllegalArgumentException("Invalid benchmark output format");
}
final NumberFormat nf = NumberFormat.getInstance();
final Number _newCurrentScore = nf.parse(split[1].trim());
final Double newCurrentScore = _newCurrentScore.doubleValue();
if (currentScore < newCurrentScore) {
currentScore = newCurrentScore;
}
}
}
// System.out.println("filterBenchmark current score:"+currentScore);
return currentScore;
}
void generateOutput(final String benchmark, final Double nashorn, final Double rhino, final Double v8) throws Exception {
Double nashornToRhino = null;
Double nashornToV8 = null;
if (rhino != null && rhino != 0) {
nashornToRhino = nashorn.doubleValue() / rhino.doubleValue();
}
if (v8 != null && rhino != 0) {
nashornToV8 = nashorn.doubleValue() / v8.doubleValue();
}
final String normalizedBenchmark=benchmark.replace("-", "");
System.out.println("benchmark-" + normalizedBenchmark + "-nashorn=" + nashorn);
AuroraWrapper.addResults(AuroraWrapper.createOrOpenDocument(), "benchmark-" + normalizedBenchmark + "-nashorn", nashorn.toString());
if (rhino != null) {
System.out.println("benchmark-" + normalizedBenchmark + "-rhino=" + rhino);
AuroraWrapper.addResults(AuroraWrapper.createOrOpenDocument(), "benchmark-" + normalizedBenchmark + "-rhino", rhino.toString());
}
if (v8 != null) {
AuroraWrapper.addResults(AuroraWrapper.createOrOpenDocument(), "benchmark-" + normalizedBenchmark + "-v8", v8.toString());
}
if (nashornToRhino != null) {
System.out.println("benchmark-" + normalizedBenchmark + "-nashorn-to-rhino=" + ((float)((int)(nashornToRhino * 100))) / 100);
AuroraWrapper.addResults(AuroraWrapper.createOrOpenDocument(), "benchmark-" + normalizedBenchmark + "-nashorn-to-rhino", "" + ((float)((int)(nashornToRhino * 100))) / 100);
}
if (nashornToV8 != null) {
System.out.println("benchmark-" + normalizedBenchmark + "-nashorn-to-v8=" + ((float)((int)(nashornToV8 * 100))) / 100);
AuroraWrapper.addResults(AuroraWrapper.createOrOpenDocument(), "benchmark-" + normalizedBenchmark + "-nashorn-to-v8", "" + ((float)((int)(nashornToV8 * 100))) / 100);
}
}
boolean checkRhinoPresence() {
final String rhinojar = System.getProperty("rhino.jar");
if (rhinojar != null) {
// System.out.println("Rhino jar found; performing comparison testing");
return true;
}
return false;
}
boolean checkV8Presence() {
final String v8shell = System.getProperty("v8.shell.full.path");
if (v8shell != null) {
// System.out.println("d8 found; performing comparison testing");
return true;
}
return false;
}
}