/* __ __ __ __ __ ___
* \ \ / / \ \ / / __/
* \ \/ / /\ \ \/ / /
* \____/__/ \__\____/__/.ɪᴏ
* ᶜᵒᵖʸʳᶦᵍʰᵗ ᵇʸ ᵛᵃᵛʳ ⁻ ˡᶦᶜᵉⁿˢᵉᵈ ᵘⁿᵈᵉʳ ᵗʰᵉ ᵃᵖᵃᶜʰᵉ ˡᶦᶜᵉⁿˢᵉ ᵛᵉʳˢᶦᵒⁿ ᵗʷᵒ ᵈᵒᵗ ᶻᵉʳᵒ
*/
package io.vavr.collection;
import io.vavr.JmhRunner;
import org.junit.Test;
import org.openjdk.jmh.annotations.*;
import static io.vavr.JmhRunner.create;
import static io.vavr.JmhRunner.getRandomValues;
import static scala.collection.JavaConverters.asScalaBuffer;
public class HashSetBenchmark {
static final Array<Class<?>> CLASSES = Array.of(
Add.class,
Iterate.class
);
@Test
public void testAsserts() {
JmhRunner.runDebugWithAsserts(CLASSES);
}
public static void main(String... args) {
JmhRunner.runNormalNoAsserts(CLASSES);
}
@State(Scope.Benchmark)
public static class Base {
@Param({ "10", "100", "1000" })
public int CONTAINER_SIZE;
int EXPECTED_AGGREGATE;
Integer[] ELEMENTS;
Set<Integer> SET;
scala.collection.immutable.Set<Integer> scalaPersistent;
org.pcollections.PSet<Integer> pcollectionsPersistent;
io.vavr.collection.Set<Integer> vavrPersistent;
@Setup
@SuppressWarnings("unchecked")
public void setup() {
ELEMENTS = getRandomValues(CONTAINER_SIZE, 0);
SET = TreeSet.of(ELEMENTS);
EXPECTED_AGGREGATE = SET.reduce(JmhRunner::aggregate);
scalaPersistent = create(v -> (scala.collection.immutable.Set<Integer>) scala.collection.immutable.HashSet$.MODULE$.apply(asScalaBuffer(v)), SET.toJavaList(), SET.size(), v -> SET.forAll(v::contains));
pcollectionsPersistent = create(org.pcollections.HashTreePSet::from, SET.toJavaList(), SET.size(), v -> SET.forAll(v::contains));
vavrPersistent = create(io.vavr.collection.HashSet::ofAll, SET, SET.size(), v -> SET.forAll(v::contains));
}
}
public static class Add extends Base {
@Benchmark
public Object pcollections_persistent() {
org.pcollections.PSet<Integer> values = org.pcollections.HashTreePSet.empty();
for (Integer element : ELEMENTS) {
values = values.plus(element);
}
assert SET.forAll(values::contains);
return values;
}
@Benchmark
public Object scala_persistent() {
scala.collection.immutable.HashSet<Integer> values = new scala.collection.immutable.HashSet<>();
for (Integer element : ELEMENTS) {
values = values.$plus(element);
}
assert SET.forAll(values::contains);
return values;
}
@Benchmark
public Object vavr_persistent() {
io.vavr.collection.Set<Integer> values = io.vavr.collection.HashSet.empty();
for (Integer element : ELEMENTS) {
values = values.add(element);
}
assert SET.forAll(values::contains);
return values;
}
}
@SuppressWarnings("ForLoopReplaceableByForEach")
public static class Iterate extends Base {
@Benchmark
public int scala_persistent() {
int aggregate = 0;
for (final scala.collection.Iterator<Integer> iterator = scalaPersistent.iterator(); iterator.hasNext(); ) {
aggregate ^= iterator.next();
}
assert aggregate == EXPECTED_AGGREGATE;
return aggregate;
}
@Benchmark
public int pcollections_persistent() {
int aggregate = 0;
for (final java.util.Iterator<Integer> iterator = pcollectionsPersistent.iterator(); iterator.hasNext(); ) {
aggregate ^= iterator.next();
}
assert aggregate == EXPECTED_AGGREGATE;
return aggregate;
}
@Benchmark
public int vavr_persistent() {
int aggregate = 0;
for (final io.vavr.collection.Iterator<Integer> iterator = vavrPersistent.iterator(); iterator.hasNext(); ) {
aggregate ^= iterator.next();
}
assert aggregate == EXPECTED_AGGREGATE;
return aggregate;
}
}
}