001: /* Copyright (C) 2004 - 2007 db4objects Inc. http://www.db4o.com
002:
003: This file is part of the db4o open source object database.
004:
005: db4o is free software; you can redistribute it and/or modify it under
006: the terms of version 2 of the GNU General Public License as published
007: by the Free Software Foundation and as clarified by db4objects' GPL
008: interpretation policy, available at
009: http://www.db4o.com/about/company/legalpolicies/gplinterpretation/
010: Alternatively you can write to db4objects, Inc., 1900 S Norfolk Street,
011: Suite 350, San Mateo, CA 94403, USA.
012:
013: db4o is distributed in the hope that it will be useful, but WITHOUT ANY
014: WARRANTY; without even the implied warranty of MERCHANTABILITY or
015: FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
016: for more details.
017:
018: You should have received a copy of the GNU General Public License along
019: with this program; if not, write to the Free Software Foundation, Inc.,
020: 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
021: package EDU.purdue.cs.bloat.benchmark;
022:
023: /**
024: * This class is used to run a benchmark Java program with Perfmon running in
025: * the background. Perfmon is a software package developed at Michigan State
026: * University that allows user-level programs to access the hardware counters on
027: * Sparc processors.
028: *
029: * <p>
030: *
031: * The <tt>main</tt> method of this class takes several arguments (note that
032: * the first four arguments are mutually exclusive):
033: *
034: * <pre>
035: * -inst-load-stall Count load interlock induced stalls
036: * -dcache Count data cache hit rate
037: * -cycle-ic-miss-stall Count I-cache miss induced stalls (and cycles)
038: * -inst-cycle Count instructions (and cycles)
039: *
040: * -run n How many times is the program run
041: *
042: * class Java class to run (the benchmark)
043: * args Arguments to benchmark class
044: * </pre>
045: *
046: * The real work is done by the native <tt>run</tt> method that is implemented
047: * in benchmark.c.
048: *
049: * @see BenchmarkSecurityManager
050: */
051: public class Benchmark {
052: static {
053: // Load native code from libbenchmark.so
054: System.loadLibrary("benchmark");
055: }
056:
057: public static native void init(Class main);
058:
059: public static native void run(Class main, String[] args);
060:
061: public static native void setMode(int mode);
062:
063: public static void main(final String[] args) throws Exception {
064: int mode = 0;
065:
066: int runs = 1;
067: int eat = 0;
068:
069: if (args.length <= 1) {
070: Benchmark.usage();
071: }
072:
073: for (eat = 0; eat < args.length; eat++) {
074: if (args[eat].equals("-inst-cycle")) {
075: mode = 3;
076: } else if (args[eat].equals("-inst-load-stall")) {
077: mode = 0;
078: } else if (args[eat].equals("-dcache")) {
079: mode = 1;
080: } else if (args[eat].equals("-cycle-ic-miss-stall")) {
081: mode = 2;
082: } else if (args[eat].equals("-run")) {
083: if (++eat >= args.length) {
084: Benchmark.usage();
085: }
086:
087: runs = Integer.parseInt(args[eat]);
088:
089: if (runs <= 0) {
090: Benchmark.usage();
091: }
092: } else {
093: // The main class
094: eat++;
095: break;
096: }
097: }
098:
099: /* Got all the args. */
100: if (eat > args.length) {
101: Benchmark.usage();
102: }
103:
104: final BenchmarkSecurityManager sec = new BenchmarkSecurityManager();
105: System.setSecurityManager(sec);
106:
107: final String mainClassName = args[eat - 1];
108: final String[] a = new String[args.length - eat];
109:
110: System.err.println("Running " + mainClassName + " in mode "
111: + mode);
112: Benchmark.setMode(mode);
113:
114: final Class mainClass = Class.forName(mainClassName);
115: Benchmark.init(mainClass);
116:
117: for (int i = 0; i < runs; i++) {
118: try {
119: System.arraycopy(args, eat, a, 0, a.length);
120: Benchmark.run(mainClass, a);
121: } catch (final SecurityException e) {
122: continue;
123: } catch (final Exception e) {
124: e.printStackTrace(System.err);
125: sec.allowExit = true;
126: System.exit(1);
127: }
128: }
129:
130: sec.allowExit = true;
131: }
132:
133: private static void usage() {
134: System.err.print("usage: java EDU.purdue.cs.bloat.Benchmark ");
135: System.err.println("options class args...");
136: System.err.println("where options are one of:");
137: System.err.println(" -inst-load-stall");
138: System.err.println(" -inst-cycle");
139: System.err.println(" -cycle-ic-miss-stall");
140: System.err.println(" -dcache");
141: System.err.println(" -run n");
142: System.exit(1);
143: }
144: }
|