import java.util.Random; import java.util.Arrays; public class CountBench { public static void main(String... args) throws ClassNotFoundException, InstantiationException, IllegalAccessException, InterruptedException { Class counterClass = Class.forName(args[0]).asSubclass(VehicleCounter.class); Vehicle[] vehicles = new Vehicle[1024 * 1024]; Random rnd = new Random(34928490398L); int numCars = 0; int numBikes = 0; int numMotorbikes = 0; for (int i = 0; i < vehicles.length; ++i) { switch (rnd.nextInt(3)) { case 0: { vehicles[i] = new Car(); ++numCars; } break; case 1: { vehicles[i] = new Bike(); ++numBikes; } break; case 2: { vehicles[i] = new Motorbike(); ++numMotorbikes; } break; } } for (int i = 0; i < 100; ++i) { benchmark(counterClass.newInstance(), vehicles, numCars, numBikes, numMotorbikes); } long[] times = new long[101]; System.gc(); Thread.sleep(100); for (int i = 0; i < times.length; ++i) { times[i] = benchmark(counterClass.newInstance(), vehicles, numCars, numBikes, numMotorbikes); } System.out.println(counterClass.getName()); Arrays.sort(times); System.out.println("min: " + times[0]); System.out.println("med: " + times[times.length / 2]); System.out.println("95%: " + times[(int)(times.length * 0.95)]); System.out.println("max: " + times[times.length - 1]); } public static long benchmark(VehicleCounter counter, Vehicle[] vehicles, int numCars, int numBikes, int numMotorbikes) { long t0 = System.nanoTime(); counter.count(vehicles); long t1 = System.nanoTime(); if (counter.getNumCars() != numCars) throw new RuntimeException("bad car count: expected " + numCars + ", got " + counter.getNumCars()); if (counter.getNumBikes() != numBikes) throw new RuntimeException("bad bike count: expected " + numBikes + ", got " + counter.getNumBikes()); if (counter.getNumMotorbikes() != numMotorbikes) throw new RuntimeException("bad motorbike count: expected " + numMotorbikes + ", got " + counter.getNumMotorbikes()); return t1 - t0; } }