/* * Written by Doug Lea with assistance from members of JCP JSR-166 * Expert Group and released to the public domain, as explained at * http://creativecommons.org/publicdomain/zero/1.0/ */ import java.util.*; import java.util.function.*; import java.util.concurrent.*; import java.util.concurrent.atomic.*; public class IntegerSum { static final int SIZE = 1000000; static final AtomicInteger checksum = new AtomicInteger(); static boolean print; static boolean allClasses = false; // true if also test dumb/default classes static final BinaryOperator SUM = (Integer x, Integer y) -> x + y; public static void main(String[] args) throws Exception { if (args.length > 0) allClasses = true; print = false; System.out.println("warmup..."); allTests(10000, 100); System.out.println("..."); print = true; int step = 10; // int step = 100; for (int reps = 0; reps < 2; ++reps) { int trials = SIZE; for (int size = 1; size <= SIZE; size *= step) { allTests(size, trials); trials /= (step / 2); } } } static String sep() { return print? "\n" : " "; } static void allTests(int size, int trials) throws Exception { System.out.println("---------------------------------------------"); System.out.println("size: " + size + " trials: " + trials); Integer[] keys = new Integer[size]; int ksum = 0; for (int i = 0; i < size; ++i) { ksum += i; keys[i] = Integer.valueOf(i); } int vsum = ksum; Integer[] vals = Arrays.copyOf(keys, size); shuffle(vals); List klist = Arrays.asList(keys); List vlist = Arrays.asList(vals); isptest(klist, ksum, size, trials); System.out.print("Arrays.asList.keys" + sep()); isptest(vlist, vsum, size, trials); System.out.print("Arrays.asList.values" + sep()); ctest(new ArrayList(), klist, ksum, size, trials); ctest(new ArrayList(), vlist, vsum, size, trials); ctest(new Vector(), klist, ksum, size, trials); ctest(new Vector(), vlist, vsum, size, trials); ctest(new ArrayDeque(), klist, ksum, size, trials); ctest(new ArrayDeque(), vlist, vsum, size, trials); ctest(new CopyOnWriteArrayList(), klist, ksum, size, trials); ctest(new CopyOnWriteArrayList(), vlist, vsum, size, trials); ctest(new PriorityQueue(), klist, ksum, size, trials); ctest(new PriorityQueue(), vlist, vsum, size, trials); ctest(new HashSet(), klist, ksum, size, trials); ctest(new HashSet(), vlist, vsum, size, trials); ctest(ConcurrentHashMap.newKeySet(), klist, ksum, size, trials); ctest(ConcurrentHashMap.newKeySet(), vlist, vsum, size, trials); ctest(new TreeSet(), klist, ksum, size, trials); ctest(new TreeSet(), vlist, vsum, size, trials); ctest(ConcurrentSkipListMap.newKeySet(), klist, ksum, size, trials); ctest(ConcurrentSkipListMap.newKeySet(), vlist, vsum, size, trials); mtest(new HashMap(), keys, vals, ksum, vsum, size, trials); mtest(new IdentityHashMap(), keys, vals, ksum, vsum, size, trials); mtest(new WeakHashMap(), keys, vals, ksum, vsum, size, trials); mtest(new ConcurrentHashMap(), keys, vals, ksum, vsum, size, trials); mtest(new TreeMap(), keys, vals, ksum, vsum, size, trials); mtest(new ConcurrentSkipListMap(), keys, vals, ksum, vsum, size, trials); if (allClasses) { mtest(new Hashtable(), keys, vals, ksum, vsum, size, trials); mtest(new LinkedHashMap(), keys, vals, ksum, vsum, size, trials); ctest(new LinkedHashSet(), klist, ksum, size, trials); ctest(new LinkedHashSet(), vlist, vsum, size, trials); ctest(new LinkedList(), klist, ksum, size, trials); ctest(new LinkedList(), vlist, vsum, size, trials); ctest(new ConcurrentLinkedQueue(), klist, ksum, size, trials); ctest(new ConcurrentLinkedQueue(), vlist, vsum, size, trials); ctest(new ConcurrentLinkedDeque(), klist, ksum, size, trials); ctest(new ConcurrentLinkedDeque(), vlist, vsum, size, trials); ctest(new LinkedBlockingQueue(SIZE), klist, ksum, size, trials); ctest(new LinkedBlockingQueue(SIZE), vlist, vsum, size, trials); ctest(new LinkedBlockingDeque(SIZE), klist, ksum, size, trials); ctest(new LinkedBlockingDeque(SIZE), vlist, vsum, size, trials); ctest(new LinkedTransferQueue(), klist, ksum, size, trials); ctest(new LinkedTransferQueue(), vlist, vsum, size, trials); ctest(new ArrayBlockingQueue(SIZE), klist, ksum, size, trials); ctest(new ArrayBlockingQueue(SIZE), vlist, vsum, size, trials); ctest(new PriorityBlockingQueue(SIZE), klist, ksum, size, trials); ctest(new PriorityBlockingQueue(SIZE), vlist, vsum, size, trials); } if (checksum.get() != 0) throw new Error("bad computation"); } static void ctest(Collection c, List klist, int ksum, int size, int trials) throws Exception { String cn = c.getClass().getName(); if (cn.startsWith("java.util.concurrent.")) cn = cn.substring(21); else if (cn.startsWith("java.util.")) cn = cn.substring(10); c.addAll(klist); isptest(c, ksum, size, trials); System.out.print(cn + sep()); } static void mtest(Map m, Integer[] keys, Integer[] vals, int ksum, int vsum, int size, int trials) throws Exception { String cn = m.getClass().getName(); if (cn.startsWith("java.util.concurrent.")) cn = cn.substring(21); else if (cn.startsWith("java.util.")) cn = cn.substring(10); for (int i = 0; i < size; ++i) m.put(keys[i], vals[i]); isptest(m.keySet(), ksum, size, trials); System.out.print(cn + ".keys" + sep()); isptest(m.values(), vsum, size, trials); System.out.print(cn + ".vals" + sep()); } static void isptest(Collection c, int sum, int size, int trials) throws Exception { long ti = itest(c, sum, trials); long ts = stest(c, sum, trials); long tp = ptest(c, sum, trials); if (print) { long scale = (long)size * trials; double di = ((double)ti) / scale; double ds = ((double)ts) / scale; double dp = ((double)tp) / scale; System.out.printf("n:%7d ", size); System.out.printf("i:%8.2f ", di); System.out.printf("s:%8.2f ", ds); System.out.printf("p:%8.2f ", dp); } } static long itest(Collection c, int sum, int trials) throws Exception { if (c == null) throw new Error(); Thread.sleep(250); long tlast = System.nanoTime(); for (int i = 0; i < trials; ++i) { Integer psum = Integer.valueOf(checksum.get()); for (Integer x : c) psum = SUM.apply(psum, x); checksum.getAndAdd(sum - psum); } return System.nanoTime() - tlast; } static long stest(Collection c, int sum, int trials) throws Exception { if (c == null) throw new Error(); Thread.sleep(250); long tlast = System.nanoTime(); for (int i = 0; i < trials; ++i) { int psum = c.stream().reduce (Integer.valueOf(checksum.get()), SUM); checksum.getAndAdd(sum - psum); } return System.nanoTime() - tlast; } static long ptest(Collection c, int sum, int trials) throws Exception { if (c == null) throw new Error(); Thread.sleep(250); long tlast = System.nanoTime(); for (int i = 0; i < trials; ++i) { int psum = c.parallelStream().reduce (Integer.valueOf(checksum.get()), SUM); checksum.getAndAdd(sum - psum); } return System.nanoTime() - tlast; } // misc static final long NPS = (1000L * 1000 * 1000); static double elapsedTime(long startTime) { return (double)(System.nanoTime() - startTime) / NPS; } static void shuffle(Object[] a) { ThreadLocalRandom rng = ThreadLocalRandom.current(); for (int i = a.length; i > 1; i--) { Object t = a[i-1]; int r = rng.nextInt(i); a[i-1] = a[r]; a[r] = t; } } }