/* * 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.OutputStream; import java.util.concurrent.Callable; import java.util.concurrent.ExecutionException; import java.util.concurrent.Future; import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeoutException; import jdk.nashorn.internal.objects.Global; import jdk.nashorn.internal.runtime.Context; import jdk.nashorn.internal.runtime.ScriptFunction; import jdk.nashorn.internal.runtime.ScriptRuntime; @SuppressWarnings("javadoc") public class PerformanceWrapper extends jdk.nashorn.tools.Shell { int _numberOfIterations; int _runsPerIteration; protected void runCompileOnlyTest(final String name, final int numberOfIterations, final int runsPerIteration, final String testURL) throws Throwable { final String[] args = { name, "--compile-only=true", "-dump-on-error", "--", testURL }; final long[] times = new long[numberOfIterations + 1]; times[0] = System.nanoTime(); // Calendar.getInstance().getTimeInMillis(); for (int iteration = 1; iteration <= numberOfIterations; iteration++) { for (int i = 0; i < runsPerIteration; i++) { run(System.in, System.out, System.err, args); } times[iteration] = System.nanoTime(); } for (int i = 0; i < numberOfIterations; i++) { System.out.println("Iteration " + (i + 1) + " average time: " + ((times[i + 1] - times[i]) / (float)runsPerIteration) / 1000000.0 + " ms."); } } protected void runExecuteOnlyTest(final String name, final int numberOfIterations, final int runsPerIteration, final String testURL) throws Throwable { runExecuteOnlyTest(name, numberOfIterations, runsPerIteration, testURL, System.out, System.err, new String[0]); } protected void runExecuteOnlyTest(final String name, final int numberOfIterations, final int runsPerIteration, final String testURL, final OutputStream out, final OutputStream err) throws Throwable { runExecuteOnlyTest(name, numberOfIterations, runsPerIteration, testURL, out, err, new String[0]); } protected void runExecuteOnlyTest(final String name, final int numberOfIterations, final int runsPerIteration, final String testURL, final OutputStream out, final OutputStream err, final String[] newargs) throws Throwable { final String[] args=new String[newargs.length+1]; System.arraycopy(newargs, 0, args, 1, newargs.length); args[0]=name; // for (String s: args) // System.out.println(s); _numberOfIterations = numberOfIterations; _runsPerIteration = runsPerIteration; run(System.in, out, err, args); // System.out.println("overridableRun finished"); } @Override protected Object apply(final ScriptFunction target, final Object self) { if (_runsPerIteration == 0 && _numberOfIterations == 0) { final Global global = jdk.nashorn.internal.runtime.Context.getGlobal(); final ScriptFunction _target = target; final Object _self = self; class MyThread implements Callable<Object> { @Override public Object call() { Context.setGlobal(global); //just execute and return script is sufficient final Object scriptRuntimeApplyResult = ScriptRuntime.apply(_target, _self); return scriptRuntimeApplyResult; } } final java.util.concurrent.ThreadPoolExecutor executor = new java.util.concurrent.ThreadPoolExecutor(1, 1, 1, TimeUnit.MINUTES, new java.util.concurrent.ArrayBlockingQueue<Runnable>(10)); final MyThread myThread = new MyThread(); // executor.execute(myThread); Object result; Future<?> futureResult = null; try { futureResult = executor.submit(myThread); final String timeout = System.getProperty("timeout.value"); int tmout = 0; if (timeout != null) { try { tmout = Integer.parseInt(timeout); } catch (final Exception e) { e.printStackTrace(); } } if (tmout != 0) { result = futureResult.get(10, TimeUnit.MINUTES); } else { result = futureResult.get(); } } catch (final InterruptedException | ExecutionException e) { e.printStackTrace(); return null; } catch (final TimeoutException e) { System.out.println("timeout while script execution"); futureResult.cancel(true); return null; } return result; } final long[] times = new long[_numberOfIterations + 1]; times[0] = System.nanoTime(); for (int iteration = 1; iteration <= _numberOfIterations; iteration++) { for (int i = 0; i < _runsPerIteration; i++) { // empty } times[iteration] = System.nanoTime(); } for (int i = 0; i < _numberOfIterations; i++) { System.out.println("Iteration " + (i + 1) + " average time: " + ((times[i + 1] - times[i]) / (float)_runsPerIteration) / 1000000.0 + " ms."); } return ScriptRuntime.apply(target, self); } }