package org.jctools.jmh.collections; import java.lang.reflect.Constructor; import java.util.Random; import java.util.Set; import java.util.concurrent.TimeUnit; import org.openjdk.jmh.annotations.Benchmark; import org.openjdk.jmh.annotations.BenchmarkMode; import org.openjdk.jmh.annotations.Level; import org.openjdk.jmh.annotations.Measurement; import org.openjdk.jmh.annotations.Mode; import org.openjdk.jmh.annotations.OutputTimeUnit; import org.openjdk.jmh.annotations.Param; import org.openjdk.jmh.annotations.Scope; import org.openjdk.jmh.annotations.Setup; import org.openjdk.jmh.annotations.State; import org.openjdk.jmh.annotations.Warmup; @OutputTimeUnit(TimeUnit.NANOSECONDS) @BenchmarkMode({ Mode.AverageTime }) @Warmup(iterations = 3, time = 1, timeUnit = TimeUnit.SECONDS) @Measurement(iterations = 5, time = 1, timeUnit = TimeUnit.SECONDS) @State(Scope.Thread) public class SetOps { static class Key { final int hash; Key(int i) { hash = i; } public int hashCode() { return hash; } public boolean equals(Object obj) { return this == obj; } } @Param("1024") int size; @Param("512") int occupancy; @Param("2048") int keyBound; @Param({ "java.util.HashSet", "org.jctools.sets.OpenHashSet"})//, "koloboke" }) String type; private Set<Key> set; private Key key; @Setup(Level.Trial) public void prepare() throws Exception { set = createSet(type, size); Random r = new Random(666); for (int i = 0; i < occupancy - 1; i++) { set.add(new Key(r.nextInt(keyBound))); } key = new Key(r.nextInt(keyBound)); set.add(key); } @Benchmark public boolean add() { return set.add(key); } @Benchmark public boolean remove() { return set.remove(key); } @Benchmark public boolean contains() { return set.contains(key); } @Benchmark public int sum() { int sum = 0; for(Key k : set) { sum += k.hash; } return sum; } @SuppressWarnings({ "rawtypes", "unchecked" }) public static Set<Key> createSet(String queueType, final int capacity) throws Exception { // if(queueType.equals("koloboke")) { // return HashObjSets.newMutableSet(capacity); // } Class clazz = Class.forName(queueType); Constructor constructor; constructor = clazz.getConstructor(Integer.TYPE); return (Set<Key>) constructor.newInstance(capacity); } }