内在函数和内联对Lambda性能的影响?

时间:2015-06-01 12:05:40

标签: java lambda jvm

我已使用此基准java8-lambda-performance-test,在运行时我已完成以下操作:

1.Disabled Intrinsic usage

2.Disabled Inlining

3.Disabled Compiling         模式

我发现禁用两个第一次优化对结果没有影响。

这很奇怪,而且在使用和打印内在的基准测试时,我没有找到任何对内在compiledLambdaForm的调用

由于数学内在函数大量使用_min,_pow ...我期望禁用内在函数会降低性能

2 个答案:

答案 0 :(得分:4)

您没有注意到预期效果效果的原因是poorly written benchmark 我使用JMH重新编写了基准测试,并且事情最终得到了解决。

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();
    }
}

结果如下:

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的工作时间延长了70%,禁用数学内在函数的版本显示速度慢了60倍!

答案 1 :(得分:1)

我不认为内在函数有任何影响,因为Lambda表达式主要使用类LambdaMetaFactory.所以这就是内联和内在函数对lambda本身没有影响的原因。

现在对于数学内在函数我相信,因为它们仅用于身份方法,仅用于LambdaExtraAverageLambdaExtraSerial测试,因此它们不会影响基准测试结果