diff options
Diffstat (limited to 'src/com/google/caliper/Runner.java')
-rw-r--r-- | src/com/google/caliper/Runner.java | 102 |
1 files changed, 31 insertions, 71 deletions
diff --git a/src/com/google/caliper/Runner.java b/src/com/google/caliper/Runner.java index 68f26f1..72442db 100644 --- a/src/com/google/caliper/Runner.java +++ b/src/com/google/caliper/Runner.java @@ -16,10 +16,10 @@ package com.google.caliper; -import com.google.common.collect.LinkedHashMultimap; -import com.google.common.collect.Multimap; import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableSet; +import com.google.common.collect.LinkedHashMultimap; +import com.google.common.collect.Multimap; import java.io.BufferedReader; import java.io.File; @@ -35,7 +35,7 @@ import java.util.*; public final class Runner { private String suiteClassName; - private BenchmarkSuite suite; + private Benchmark suite; /** Effective parameters to run in the benchmark. */ private Multimap<String, String> parameters = LinkedHashMultimap.create(); @@ -50,12 +50,6 @@ public final class Runner { private Multimap<String, String> userParameters = LinkedHashMultimap.create(); /** - * Benchmark class specified by the user on the command line; or null to run - * the complete set of benchmark classes. - */ - private Class<? extends Benchmark> userBenchmarkClass; - - /** * True if each benchmark should run in process. */ private boolean inProcess; @@ -75,13 +69,13 @@ public final class Runner { private void prepareSuite() { try { @SuppressWarnings("unchecked") // guarded by the if statement that follows - Class<? extends BenchmarkSuite> suiteClass - = (Class<? extends BenchmarkSuite>) Class.forName(suiteClassName); - if (!BenchmarkSuite.class.isAssignableFrom(suiteClass)) { + Class<? extends Benchmark> suiteClass + = (Class<? extends Benchmark>) Class.forName(suiteClassName); + if (!Benchmark.class.isAssignableFrom(suiteClass)) { throw new ConfigurationException(suiteClass + " is not a benchmark suite."); } - Constructor<? extends BenchmarkSuite> constructor = suiteClass.getDeclaredConstructor(); + Constructor<? extends Benchmark> constructor = suiteClass.getDeclaredConstructor(); suite = constructor.newInstance(); } catch (InvocationTargetException e) { throw new ExecutionException(e.getCause()); @@ -121,33 +115,14 @@ public final class Runner { private List<Run> createRuns() throws Exception { List<RunBuilder> builders = new ArrayList<RunBuilder>(); - // create runs for each benchmark class - Set<Class<? extends Benchmark>> benchmarkClasses = (userBenchmarkClass != null) - ? ImmutableSet.<Class<? extends Benchmark>>of(userBenchmarkClass) - : suite.benchmarkClasses(); - for (Class<? extends Benchmark> benchmarkClass : benchmarkClasses) { - RunBuilder builder = new RunBuilder(); - builder.benchmarkClass = benchmarkClass; - builders.add(builder); - } - - // multiply the runs by the number of VMs + // create runs for each VMs Set<String> vms = userVms.isEmpty() ? defaultVms() : userVms; - Iterator<String> vmIterator = vms.iterator(); - String firstVm = vmIterator.next(); - for (RunBuilder builder : builders) { - builder.vm = firstVm; - } - int length = builders.size(); - while (vmIterator.hasNext()) { - String alternateVm = vmIterator.next(); - for (int s = 0; s < length; s++) { - RunBuilder copy = builders.get(s).copy(); - copy.vm = alternateVm; - builders.add(copy); - } + for (String vm : vms) { + RunBuilder runBuilder = new RunBuilder(); + runBuilder.vm = vm; + builders.add(runBuilder); } for (Map.Entry<String, Collection<String>> parameter : parameters.asMap().entrySet()) { @@ -164,10 +139,10 @@ public final class Runner { } // multiply the size of the specs by the number of alternate values - length = builders.size(); + int size = builders.size(); while (values.hasNext()) { String alternate = values.next(); - for (int s = 0; s < length; s++) { + for (int s = 0; s < size; s++) { RunBuilder copy = builders.get(s).copy(); copy.parameters.put(key, alternate); builders.add(copy); @@ -185,19 +160,17 @@ public final class Runner { static class RunBuilder { Map<String, String> parameters = new LinkedHashMap<String, String>(); - Class<? extends Benchmark> benchmarkClass; String vm; RunBuilder copy() { RunBuilder result = new RunBuilder(); result.parameters.putAll(parameters); - result.benchmarkClass = benchmarkClass; result.vm = vm; return result; } public Run build() { - return new Run(parameters, benchmarkClass, vm); + return new Run(parameters, vm); } } @@ -213,8 +186,6 @@ public final class Runner { command.add("--runMillis"); command.add(String.valueOf(runMillis)); command.add("--inProcess"); - command.add("--benchmark"); - command.add(run.getBenchmarkClass().getName()); for (Map.Entry<String, String> entry : run.getParameters().entrySet()) { command.add("-D" + entry.getKey() + "=" + entry.getValue()); } @@ -270,6 +241,14 @@ public final class Runner { afterRun(nanosPerTrial); resultsBuilder.put(run, nanosPerTrial); } + + // blat out our progress bar + System.out.print("\r"); + for (int j = 0; j < 80; j++) { + System.out.print(" "); + } + System.out.print("\r"); + return new Result(resultsBuilder.build()); } catch (Exception e) { throw new ExecutionException(e); @@ -283,12 +262,12 @@ public final class Runner { if (runString.length() > runStringLength) { runString = runString.substring(0, runStringLength); } - System.out.printf("%2.0f%% %-" + runStringLength + "s", + System.out.printf("\r%2.0f%% %-" + runStringLength + "s", percentDone * 100, runString); } private void afterRun(double nanosPerTrial) { - System.out.printf(" %10.0fns%n", nanosPerTrial); + System.out.printf(" %10.0fns", nanosPerTrial); } private void runInProcess() { @@ -297,10 +276,9 @@ public final class Runner { for (Run run : createRuns()) { double result; - Benchmark benchmark = suite.createBenchmark( - run.getBenchmarkClass(), run.getParameters()); - double warmupNanosPerTrial = caliper.warmUp(benchmark); - result = caliper.run(benchmark, warmupNanosPerTrial); + TimedRunnable timedRunnable = suite.createBenchmark(run.getParameters()); + double warmupNanosPerTrial = caliper.warmUp(timedRunnable); + result = caliper.run(timedRunnable, warmupNanosPerTrial); double nanosPerTrial = result; System.out.println(nanosPerTrial); } @@ -309,24 +287,11 @@ public final class Runner { } } - private boolean parseArgs(String[] args) { + private boolean parseArgs(String[] args) throws Exception { for (int i = 0; i < args.length; i++) { if ("--help".equals(args[i])) { return false; - } else if ("--benchmark".equals(args[i])) { - try { - @SuppressWarnings("unchecked") // guarded immediately afterwards! - Class<? extends Benchmark> c = (Class<? extends Benchmark>) Class.forName(args[++i]); - if (!Benchmark.class.isAssignableFrom(c)) { - System.out.println("Not a benchmark class: " + c); - return false; - } - userBenchmarkClass = c; - } catch (ClassNotFoundException e) { - throw new RuntimeException(e); - } - } else if ("--inProcess".equals(args[i])) { inProcess = true; @@ -358,9 +323,7 @@ public final class Runner { System.out.println("Too many benchmark classes!"); return false; } - suiteClassName = args[i]; - } } @@ -388,8 +351,6 @@ public final class Runner { System.out.println(" When multiple values for the same parameter are given (via"); System.out.println(" multiple --Dx=y args), all supplied values are used."); System.out.println(); - System.out.println(" --benchmark <class>: fix a benchmark executable to the named class"); - System.out.println(); System.out.println(" --inProcess: run the benchmark in the same JVM rather than spawning"); System.out.println(" another with the same classpath. By default each benchmark is"); System.out.println(" run in a separate VM"); @@ -403,7 +364,7 @@ public final class Runner { // adding new options? don't forget to update executeForked() } - public static void main(String... args) { + public static void main(String... args) throws Exception { // TODO: cleaner error reporting Runner runner = new Runner(); if (!runner.parseArgs(args)) { runner.printUsage(); @@ -418,11 +379,10 @@ public final class Runner { } Result result = runner.runOutOfProcess(); - System.out.println(); new ConsoleReport(result).displayResults(); } - public static void main(Class<? extends BenchmarkSuite> suite, String... args) { + public static void main(Class<? extends Benchmark> suite, String... args) throws Exception { String[] argsWithSuiteName = new String[args.length + 1]; System.arraycopy(args, 0, argsWithSuiteName, 0, args.length); argsWithSuiteName[args.length] = suite.getName(); |