/* __ __ __ __ __ ___
* \ \ / / \ \ / / __/
* \ \/ / /\ \ \/ / /
* \____/__/ \__\____/__/.ɪᴏ
* ᶜᵒᵖʸʳᶦᵍʰᵗ ᵇʸ ᵛᵃᵛʳ ⁻ ˡᶦᶜᵉⁿˢᵉᵈ ᵘⁿᵈᵉʳ ᵗʰᵉ ᵃᵖᵃᶜʰᵉ ˡᶦᶜᵉⁿˢᵉ ᵛᵉʳˢᶦᵒⁿ ᵗʷᵒ ᵈᵒᵗ ᶻᵉʳᵒ
*/
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 io.vavr.collection.Collections.areEqual;
import static scala.collection.JavaConverters.asJavaCollection;
import static scala.collection.JavaConverters.asScalaBuffer;
public class BitSetBenchmark {
static final Array<Class<?>> CLASSES = Array.of(
AddAll.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;
int[] ELEMENTS;
TreeSet<Integer> DISTINCT;
scala.collection.immutable.BitSet scalaPersistent;
io.vavr.collection.BitSet<Integer> vavrPersistent;
@Setup
@SuppressWarnings("RedundantCast")
public void setup() {
final Integer[] values = getRandomValues(CONTAINER_SIZE, 0, true);
ELEMENTS = new int[CONTAINER_SIZE];
for (int i = 0; i < CONTAINER_SIZE; i++) {
ELEMENTS[i] = values[i];
}
DISTINCT = TreeSet.ofAll(ELEMENTS);
EXPECTED_AGGREGATE = DISTINCT.reduce(JmhRunner::aggregate);
scalaPersistent = create(v -> (scala.collection.immutable.BitSet) scala.collection.immutable.BitSet$.MODULE$.apply(asScalaBuffer(v)), DISTINCT.toJavaList(), v -> areEqual(asJavaCollection(v), DISTINCT));
vavrPersistent = create(io.vavr.collection.BitSet::ofAll, ELEMENTS, ELEMENTS.length, v -> areEqual(v, DISTINCT));
}
}
public static class AddAll extends Base {
@Benchmark
public Object scala_persistent() {
scala.collection.immutable.BitSet values = new scala.collection.immutable.BitSet.BitSet1(0L);
for (int element : ELEMENTS) {
values = values.$plus(element);
}
assert ((scala.collection.immutable.SortedSet) values).equals(scalaPersistent);
return values;
}
@Benchmark
public Object vavr_persistent() {
io.vavr.collection.Set<Integer> values = io.vavr.collection.BitSet.empty();
for (Integer element : ELEMENTS) {
values = values.add(element);
}
assert values.equals(vavrPersistent);
return values;
}
}
@SuppressWarnings("ForLoopReplaceableByForEach")
public static class Iterate extends Base {
@Benchmark
public int scala_persistent() {
int aggregate = 0;
for (final scala.collection.Iterator<Object> iterator = scalaPersistent.iterator(); iterator.hasNext(); ) {
aggregate ^= (Integer) 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;
}
}
}