Beklenen bir performans etkisini fark etmemenizin nedeni poorly written benchmark.
JMH kullanarak benchmark yazdım ve nihayet doğru olan şeyler.
Beklendiği gibi
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
, -XX:-Inline
ile kıyaslama artık% 70 çalışır ve Matematik ile versiyon intrinsics engelli 60 kat daha yavaş gibi görünen: Burada
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();
}
}
sonuçlardır!
Sonuçlarınızın güzel ifadeleri. Eğer bu bir problemse, neden açıkça ve neyi beklediğinizi açıkça belirtin. Aksi halde sorun görmedim. –
Gönderiyi düzenledim – Bionix1441
Makaleye bir göz atmak, söyleyebildiğim çok eski olduğunu söyledi (Mar 17, 2014). Bu yazıdan bu yana Java 8 güncellemesi olabilir. Eğer yazar tarafından kullanılana farklı bir JVM sürümü kullanıyorsanız (ki o bunu belirtmez), testinizin farklı sonuçlar göstermesi oldukça anlaşılır bir durumdur. Erken bir Java 8 kullanmayı deneyin ve bunun herhangi bir fark yaratıp yaratmadığını görün. –