¿Por qué lambda IntStream.anyMatch () es 10 más lento que la implementación ingenua?

Recientemente estaba perfilando mi código y encontré un cuello de botella interesante en él. Aquí está el punto de referencia:

@BenchmarkMode(Mode.Throughput)
@Fork(1)
@State(Scope.Thread)
@Warmup(iterations = 10, time = 1, timeUnit = TimeUnit.SECONDS)
@Measurement(iterations = 10, time = 1, timeUnit = TimeUnit.SECONDS)
public class Contains {

    private int[] ar = new int[] {1,2,3,4,5,6,7};

    private int val = 5;

    @Benchmark
    public boolean naive() {
        return contains(ar, val);
    }

    @Benchmark
    public boolean lambdaArrayStreamContains() {
        return Arrays.stream(ar).anyMatch(i -> i == val);
    }

    @Benchmark
    public boolean lambdaIntStreamContains() {
        return IntStream.of(ar).anyMatch(i -> i == val);
    }

    private static boolean contains(int[] ar, int value) {
        for (int arVal : ar) {
            if (arVal == value) {
                return true;
            }
        }
        return false;
    }

}

Resultado:

Benchmark                            Mode  Cnt       Score      Error  Units
Contains.lambdaArrayStreamContains  thrpt   10   22867.962 ± 1049.649  ops/s
Contains.lambdaIntStreamContains    thrpt   10   22983.800 ±  593.580  ops/s
Contains.naive                      thrpt   10  228002.406 ± 8591.186  ops/s

Si muestra que Array contiene operación a través de lambda es 10 veces más lenta que la implementación ingenua con bucle simple. Sabía que las lambdas deberían ser un poco más lentas. ¿Pero 10 veces? ¿Estoy haciendo mal lambda o esto es algún problema con Java?

Respuestas a la pregunta(1)

Su respuesta a la pregunta