/* __ __ __ __ __ ___
* \ \ / / \ \ / / __/
* \ \/ / /\ \ \/ / /
* \____/__/ \__\____/__/.ɪᴏ
* ᶜᵒᵖʸʳᶦᵍʰᵗ ᵇʸ ᵛᵃᵛʳ ⁻ ˡᶦᶜᵉⁿˢᵉᵈ ᵘⁿᵈᵉʳ ᵗʰᵉ ᵃᵖᵃᶜʰᵉ ˡᶦᶜᵉⁿˢᵉ ᵛᵉʳˢᶦᵒⁿ ᵗʷᵒ ᵈᵒᵗ ᶻᵉʳᵒ
*/
package io.vavr.idiom;
import io.vavr.JmhRunner;
import io.vavr.collection.Array;
import org.junit.Test;
import org.openjdk.jmh.annotations.Benchmark;
import org.openjdk.jmh.annotations.Scope;
import org.openjdk.jmh.annotations.Setup;
import org.openjdk.jmh.annotations.State;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.function.BiFunction;
import static java.util.stream.Collectors.toList;
import static io.vavr.API.*;
import static io.vavr.JmhRunner.getRandomValues;
/**
* Benchmark for nested loops vs Vavr's For().yield comprehensions.
*
* @see For2
*/
public class ForBenchmark {
static final Array<Class<?>> CLASSES = Array(
For.class
);
@Test
public void testAsserts() {
JmhRunner.runDebugWithAsserts(CLASSES);
}
public static void main(String... args) {
JmhRunner.runNormalNoAsserts(CLASSES);
}
@State(Scope.Benchmark)
public static class Base {
int CONTAINER_SIZE = 1000;
int AGGREGATE;
List<Integer> ELEMENTS;
final BiFunction<Integer, Integer, Integer> AGGREGATOR = (i, j) -> i ^ j;
@Setup
public void setup() {
ELEMENTS = Arrays.asList(getRandomValues(CONTAINER_SIZE, 0, true));
AGGREGATE = 0;
for (Integer i : ELEMENTS) {
for (Integer j : ELEMENTS) {
AGGREGATE += AGGREGATOR.apply(i, j);
}
}
}
}
public static class For extends Base {
@Benchmark
public Object java_for() {
final List<Integer> result = new ArrayList<>(CONTAINER_SIZE * CONTAINER_SIZE);
for (Integer i : ELEMENTS) {
for (Integer j : ELEMENTS) {
result.add(AGGREGATOR.apply(i, j));
}
}
assert Array(result).sum().intValue() == AGGREGATE;
return result;
}
@Benchmark
public Object vavr_for() {
final List<Integer> result = For(ELEMENTS, ELEMENTS).yield(AGGREGATOR).collect(toList());
assert Array(result).sum().intValue() == AGGREGATE;
return result;
}
}
}