Il motivo per cui non si è notato un effetto prestazionale atteso è poorly written benchmark.
Ho riscritto il benchmark utilizzando JMH e le cose finalmente sono andate bene.
package lambdademo;
import org.openjdk.jmh.annotations.*;
import java.util.List;
@State(Scope.Benchmark)
public class LambdaBenchmark {
@Param("100")
private static int loopCount;
private static double identity(double val) {
double result = 0;
for (int i=0; i < loopCount; i++) {
result += Math.sqrt(Math.abs(Math.pow(val, 2)));
}
return result/loopCount;
}
private List<EmployeeRec> employeeList = new EmployeeFile().loadEmployeeList();
@Benchmark
public double streamAverage() {
return streamAverageNoInline();
}
@Benchmark
@Fork(jvmArgs = "-XX:-Inline")
public double streamAverageNoInline() {
return employeeList.stream()
.filter(s -> s.getGender().equals("M"))
.mapToDouble(s -> s.getAge())
.average()
.getAsDouble();
}
@Benchmark
public double streamMath() {
return streamMathNoIntrinsic();
}
@Benchmark
@Fork(jvmArgs = {"-XX:+UnlockDiagnosticVMOptions", "-XX:DisableIntrinsic=_dpow,_dabs,_dsqrt"})
public double streamMathNoIntrinsic() {
return employeeList.stream()
.filter(s -> s.getGender().equals("M"))
.mapToDouble(s -> identity(s.getAge()))
.average()
.getAsDouble();
}
}
Ecco i risultati:
Benchmark Mode Cnt Score Error Units
LambdaBenchmark.streamAverage avgt 5 71,490 ± 0,770 ms/op
LambdaBenchmark.streamAverageNoInline avgt 5 122,740 ± 0,576 ms/op
LambdaBenchmark.streamMath avgt 5 92,672 ± 1,538 ms/op
LambdaBenchmark.streamMathNoIntrinsic avgt 5 5747,007 ± 20,387 ms/op
Come previsto, il punto di riferimento con -XX:-Inline
lavora il 70% più a lungo, e la versione con la matematica intrinseche disabile sembra essere 60 volte più lento!
Belle dichiarazioni dei risultati. Se questo è un problema, spiega chiaramente perché e cosa ti saresti aspettato. Altrimenti non ho visto nessun problema. –
Ho modificato il mio post – Bionix1441
Dando un'occhiata all'articolo tutto quello che posso dire è che è piuttosto vecchio (17 marzo 2014). Ci sono stati aggiornamenti di Java 8 da questo articolo. Se stai utilizzando una versione JVM diversa da quella usata dall'autore (che non dichiara), allora è abbastanza comprensibile che i tuoi test mostrino risultati diversi. Prova a utilizzare un Java 8 e vedere se questo fa alcuna differenza. –