package com.insightfullogic.java8.answers.chapter6; import org.openjdk.jmh.Main; import org.openjdk.jmh.annotations.*; import org.openjdk.jmh.runner.RunnerException; import java.io.IOException; import java.util.ArrayList; import java.util.LinkedList; import java.util.List; import java.util.stream.IntStream; @State(Scope.Thread) @BenchmarkMode(Mode.AverageTime) public class OptimisationExampleFixed { public static void main(String[] ignore) throws RunnerException, IOException { final String[] args = { ".*OptimisationExampleFixed.*", "-wi", "10", "-i", "10", "-f", "1" }; Main.main(args); } private List<Integer> arrayListOfNumbers; private List<Integer> linkedListOfNumbers; @Setup public void init() { arrayListOfNumbers= new ArrayList<>(); addNumbers(arrayListOfNumbers); linkedListOfNumbers = new LinkedList<>(); addNumbers(linkedListOfNumbers); } private void addNumbers(List<Integer> container) { IntStream.range(0, 1_000_000) .forEach(container::add); } @GenerateMicroBenchmark public int slowSumOfSquares() { return linkedListOfNumbers.parallelStream() .map(x -> x * x) .reduce(0, (acc, x) -> acc + x); } @GenerateMicroBenchmark public int serialSlowSumOfSquares() { return linkedListOfNumbers.stream() .map(x -> x * x) .reduce(0, (acc, x) -> acc + x); } @GenerateMicroBenchmark public int intermediateSumOfSquares() { return arrayListOfNumbers.parallelStream() .map(x -> x * x) .reduce(0, (acc, x) -> acc + x); } @GenerateMicroBenchmark public int serialIntermediateSumOfSquares() { return arrayListOfNumbers.stream() .map(x -> x * x) .reduce(0, (acc, x) -> acc + x); } @GenerateMicroBenchmark public int fastSumOfSquares() { return arrayListOfNumbers.parallelStream() .mapToInt(x -> x * x) .sum(); } @GenerateMicroBenchmark public int serialFastSumOfSquares() { return arrayListOfNumbers.stream() .mapToInt(x -> x * x) .sum(); } }