Код: Выделить всё
import org.openjdk.jmh.annotations.*;
import org.openjdk.jmh.runner.Runner;
import org.openjdk.jmh.runner.RunnerException;
import org.openjdk.jmh.runner.options.Options;
import org.openjdk.jmh.runner.options.OptionsBuilder;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
import java.util.stream.IntStream;
@State(Scope.Thread)
@BenchmarkMode(Mode.AverageTime)
@OutputTimeUnit(TimeUnit.MICROSECONDS)
@Fork(
value = 1,
jvmArgs = {
"-XX:-TieredCompilation",
"-Xms16g"
})
public class Test {
private static final int[] NUMS = IntStream.range(0, 100_000).toArray();
private static final Integer[] BOXED_NUMS = Arrays.stream(NUMS).boxed().toArray(Integer[]::new);
@Benchmark
public int m1() {
return Arrays.stream(NUMS) // IntStream
.map(i -> i * i)
.sum();
}
@Benchmark
public int m2() {
return Arrays.stream(BOXED_NUMS) // Regular stream
.mapToInt(i -> i * i) // Turns to IntStream
.sum();
}
public static void main(String[] args) throws RunnerException {
Options options = new OptionsBuilder()
.include(Test.class.getSimpleName())
.build();
new Runner(options).run();
}
}
Код: Выделить всё
IntStream
Получил следующие результаты:
Код: Выделить всё
Benchmark Mode Cnt Score Error Units
Test.m1 avgt 5 281.326 ± 2.409 us/op
Test.m2 avgt 5 46.450 ± 0.520 us/op
Так почему же m2 быстрее?
EDIT: добавлено все элементы, связанные с JMH, в коде.
EDIT2: добавлены результаты JMH на M1 Mac
Подробнее здесь: https://stackoverflow.com/questions/784 ... ve-version