/* Copyright (C) 2021-2024 Free Software Foundation, Inc. Contributed by Oracle. This file is part of GNU Binutils. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3, or (at your option) any later version. This program 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 for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */ import java.util.*; import java.io.*; import java.text.*; class jsynprog { private static String dir_home; private static PrintWriter log; private static double pstart, cstart; /* JNI calls */ public static native double Timer(); private static native double cTimer(); private static native double computeSet(); private static native int JavaJavaC(int np, int scale); private static native void JavaCC(int scale); private static native void JavaCJava(int scale); private static native int isJVMPI(); public static double testtime = 3.0 * 1e9; public static void main (String [] args) { jsynprog jsyn_obj = new jsynprog(); Integer ni; int scale = 1000; String commands = "memalloc.add_int.add_double.has_inner_class" + ".recurse.recursedeep.bounce.array_op.vector_op.sys_op" + ".jni_JavaJavaC.JavaCC.JavaCJava.Launcher"; createAcct(); LoadJNILibrary(args); testtime = computeSet(); /* check for invocation parameter */ for (int i = 0; i < args.length; i++) { if (args[i].equals("-fast")) { scale = 10000; } else if (args[i].equals("-slow")) { scale = 1; } else if (args[i].equals("-j") && i + 1 < args.length) { commands = args[++i]; } else { System.err.println("fatal: unexpected argument: " + args[0] ); System.exit(1); } } /* large memory allocations, trigger gc */ Routine rtn = new Routine(); Sub_Routine sbrt = new Sub_Routine(); if (commands.indexOf("memalloc") >= 0) { recTime(); rtn.memalloc(10000, scale); printValue("Routine.memalloc", false); } /* add integers */ if (commands.indexOf("add_int") >= 0) { recTime(); ni = new Integer (rtn.add_int(scale)); printValue("Routine.add_int", true); } /* add double */ if (commands.indexOf("add_double") >= 0) { recTime(); Double nd = new Double(rtn.add_double(scale)); printValue("Routine.add_double", true); } /* call method in derived class */ if (commands.indexOf("add_int") >= 0) { recTime(); ni = new Integer (sbrt.add_int(scale)); printValue("Sub_Routine.add_int", true); } /* call method that defines an inner class */ if (commands.indexOf("has_inner_class") >= 0) { recTime(); Integer[] na = rtn.has_inner_class(scale); printValue("Routine.has_inner_class", true); } /* recursion */ if (commands.indexOf("recurse") >= 0) { recTime(); rtn.recurse(0,80, scale); printValue("Routine.recurse", true); } /* deep recursion */ if (commands.indexOf("recursedeep") >= 0) { recTime(); rtn.recursedeep(0,500, scale); printValue("", true); } /* indirect recursion */ if (commands.indexOf("bounce") >= 0) { recTime(); rtn.bounce(0,20, scale); printValue("Routine.bounce", true); } /* array operations */ if (commands.indexOf("array_op") >= 0) { recTime(); rtn.array_op(scale); printValue("Routine.array_op", false); } /* Vector operations */ if (commands.indexOf("vector_op") >= 0) { recTime(); rtn.vector_op(scale); printValue("Routine.vector_op", false); } /* spend time in system calls */ if (commands.indexOf("sys_op") >= 0) { recTime(); rtn.sys_op(scale); printValue("Routine.sys_op", false); } /* java->java->c */ if (commands.indexOf("jni_JavaJavaC") >= 0) { recTime(); int np = 0; jni_JavaJavaC(np, scale); printValue("jsynprog.jni_JavaJavaC", true); } /* java->c->c */ if (commands.indexOf("JavaCC") >= 0) { recTime(); JavaCC(scale); printValue("jsynprog.JavaCC", true); } /* java->c->java */ if (commands.indexOf("JavaCJava") >= 0) { recTime(); JavaCJava(scale); printValue("jsynprog.JavaCJava", true); } /* dynamically loaded classes */ if (commands.indexOf("Launcher") >= 0) { String java_ver = System.getProperty("java.version"); Launcher lnch = new Launcher(); String[] params = new String[]{"DynLoadedClass"}; recTime(); lnch.main(params); printValue("Launcher.main", true); } System.gc(); } /* ** Create accounting file */ private static void createAcct() { System.out.println ("Directing output to acct file..."); try { log = new PrintWriter (new FileWriter("jsynprog.acct"), true); } catch (IOException ioe) { ioe.printStackTrace(); System.err.println("fatal: Cannot create accounting file "); System.exit(1); } log.println("X\tLWPTime\tCPUTime\tFunction"); } /* ** Print output in acct file */ private static void printValue (String fname, boolean noignore) { double p_end = Timer(); // Global.Timer(); double c_end = cTimer(); // Global.cTimer(); double prog_elapsed = p_end - pstart; double cpu_elapsed = c_end - cstart; DecimalFormat format_decimal = new DecimalFormat("0.000"); System.out.println("Running " + fname + "; T = " + format_decimal.format(prog_elapsed * 0.000000001) +" UCPU = " + format_decimal.format(cpu_elapsed * 0.000000001)); log.print( (noignore == true? "X" : "Y") + "\t" + format_decimal.format(prog_elapsed * 0.000000001) + "\t" + format_decimal.format(cpu_elapsed * 0.000000001) + "\t"); log.println(fname); } /* ** Record intial times */ private static void recTime() { pstart = Timer(); // Global.Timer(); cstart = cTimer(); // Global.cTimer(); } /* ** Load dynamic shared library for JNI */ private static void LoadJNILibrary(String[] args) { try { dir_home = (new File(".")).getCanonicalPath(); } catch (IOException e) { dir_home = ".."; } System.out.println("libpath:"+dir_home); // Find which JVM was invoked String jvm_format = System.getProperty("java.vm.name"); System.out.println("jvm "+ jvm_format); try { System.out.println("Loading library.... " + dir_home + "/libcloop.so"); System.load(dir_home + "/libcloop.so"); } catch (UnsatisfiedLinkError e) { System.err.println("fatal: Cannot load shared library " + e); System.exit(1); } } /* ** Makes a lot of JNI calls */ private static void jni_JavaJavaC(int np, int scale) { int ret = 0; int jmax = 10000; System.out.println("Entering jni_JavaJavaC, scale = " + scale); double tEnd = Timer() + testtime; do { for (int j =0 ; j