import static java.lang.System.out; import java.util.Random; import java.util.TreeMap; import org.javersion.util.MutableTreeMap; import org.javersion.util.PersistentHashMap; import org.javersion.util.PersistentTreeMap; public class PerfTest { private static long start; public static void main(String[] args) { Integer[] data = randomData(4000); runJaversion(data); // runJaversionTree(data); // runJaversionMutableTree(data); // runClojure(data); // runClojureTree(data); // runJavaTree(data); } private static void runJaversion(Integer[] data) { out.println("Javersion PersistentHashMap"); PersistentHashMap<Integer, Integer> jmap = PersistentHashMap.empty(); // warmup for (Integer v : data) { jmap = jmap.assoc(v, v); } jmap = null; System.gc(); long begin = System.nanoTime(); for (int i=1; i <= data.length; i++) { start(); jmap = PersistentHashMap.empty(); for (int j=0; j < i; j++) { jmap = jmap.assoc(data[j], data[j]); } for (int j=0; j < i; j++) { jmap = jmap.dissoc(data[j]); } out.println(end()); } out.println(String.format("\n%s", System.nanoTime() - begin)); } private static void runClojure(Integer[] data) { out.println("Clojure PersistentHashMap"); clojure.lang.PersistentHashMap cmap = clojure.lang.PersistentHashMap.EMPTY; // warmup for (Integer v : data) { cmap = (clojure.lang.PersistentHashMap) cmap.assoc(v, v); } cmap = null; System.gc(); long begin = System.nanoTime(); for (int i=1; i <= data.length; i++) { start(); cmap = clojure.lang.PersistentHashMap.EMPTY; for (int j=0; j < i; j++) { cmap = (clojure.lang.PersistentHashMap) cmap.assoc(data[j], data[j]); } for (int j=0; j < i; j++) { cmap = (clojure.lang.PersistentHashMap) cmap.without(data[j]); } out.println(end()); } out.println(String.format("\n%s", System.nanoTime() - begin)); } private static void runJaversionTree(Integer[] data) { out.println("Javersion PersistentTreeMap"); @SuppressWarnings("unchecked") PersistentTreeMap<Integer, Integer> jmap = PersistentTreeMap.EMPTY; // warmup for (Integer v : data) { jmap = jmap.assoc(v, v); } jmap = null; // System.gc(); long begin = System.nanoTime(); for (int i=1; i <= data.length; i++) { start(); jmap = PersistentTreeMap.EMPTY; for (int j=0; j < i; j++) { jmap = jmap.assoc(data[j], data[j]); } for (int j=0; j < i; j++) { jmap = jmap.dissoc(data[j]); } out.println(end()); } out.println(String.format("\nJaversion total time: %s", System.nanoTime() - begin)); } private static void runJaversionMutableTree(Integer[] data) { out.println("Javersion MutableTreeMap"); MutableTreeMap<Integer, Integer> jmap = new MutableTreeMap<>(); // warmup for (Integer v : data) { jmap.put(v, v); } jmap = null; // System.gc(); long begin = System.nanoTime(); for (int i=1; i <= data.length; i++) { start(); jmap = new MutableTreeMap<>(); for (int j=0; j < i; j++) { jmap.put(data[j], data[j]); } for (int j=0; j < i; j++) { jmap.remove(data[j]); } out.println(end()); } out.println(String.format("\n%s", System.nanoTime() - begin)); } private static void runJavaTree(Integer[] data) { out.println("Java TreeMap"); TreeMap<Integer, Integer> map = new TreeMap<Integer, Integer>(); // warmup for (Integer v : data) { map.put(v, v); } map = null; // System.gc(); long begin = System.nanoTime(); for (int i=1; i <= data.length; i++) { start(); map = new TreeMap<Integer, Integer>(); for (int j=0; j < i; j++) { map.put(data[j], data[j]); } for (int j=0; j < i; j++) { map.remove(data[j]); } out.println(end()); } out.println(String.format("\n%s", System.nanoTime() - begin)); } private static void runClojureTree(Integer[] data) { out.println("Clojure PersistentTreeMap"); clojure.lang.PersistentTreeMap cmap = clojure.lang.PersistentTreeMap.EMPTY; // warmup for (Integer v : data) { cmap = cmap.assoc(v, v); } cmap = null; // System.gc(); long begin = System.nanoTime(); for (int i=1; i <= data.length; i++) { start(); cmap = clojure.lang.PersistentTreeMap.EMPTY; for (int j=0; j < i; j++) { cmap = cmap.assoc(data[j], data[j]); } for (int j=0; j < i; j++) { cmap = cmap.without(data[j]); } out.println(end()); } out.println(String.format("\n%s", System.nanoTime() - begin)); } private static void start() { start = System.nanoTime(); } private static long end() { return System.nanoTime() - start; } private static final Random RANDOM = new Random(); public static Integer[] sequentialData(int length) { Integer[] data = new Integer[length]; for (int i=0; i < length; i++) { data[i] = i; } return data; } public static Integer[] randomData(int length) { Integer[] data = new Integer[length]; for (int i=0; i < length; i++) { data[i] = RANDOM.nextInt(length); } return data; } }