gpt4 book ai didi

java - 尝试对 lambda 性能进行基准测试

转载 作者:搜寻专家 更新时间:2023-11-01 04:05:39 26 4
gpt4 key购买 nike

我读过这篇文章:Performance difference between Java 8 lambdas and anonymous inner classes并在那里提供article

上面写着:

Lambda invocation behaves exactly as anonymous class invocation

“好的”我说并决定编写自己的基准,我使用了 jmh,下面是(我还添加了基准以供方法引用)。

public class MyBenchmark {

public static final int TESTS_COUNT = 100_000_000;

@Benchmark
public void testMethod_lambda() {
X x = i -> test(i);
for (long i = 0; i < TESTS_COUNT; i++) {
x.x(i);
}
}
@Benchmark
public void testMethod_methodRefernce() {
X x = this::test;
for (long i = 0; i < TESTS_COUNT; i++) {
x.x(i);
}
}
@Benchmark
public void testMethod_anonymous() {
X x = new X() {
@Override
public void x(Long i) {
test(i);
}
};
for (long i = 0; i < TESTS_COUNT; i++) {
x.x(i);
}
}

interface X {
void x(Long i);
}

public void test(Long i) {
if (i == null) System.out.println("never");
}
}

结果(在 Intel Core i7 4770k 上)是:

Benchmark                                     Mode  Samples   Score  Score error  Units
t.j.MyBenchmark.testMethod_anonymous thrpt 200 16,160 0,044 ops/s
t.j.MyBenchmark.testMethod_lambda thrpt 200 4,102 0,029 ops/s
t.j.MyBenchmark.testMethod_methodRefernce thrpt 200 4,149 0,022 ops/s

因此,如您所见,lambda 和匿名方法调用之间存在 4 倍的差异,其中 lambda 慢 4 倍。

问题是我做错了什么或者我对 lambda 的性能理论有误解?

编辑:

# VM invoker: C:\Program Files\Java\jre1.8.0_31\bin\java.exe
# VM options: <none>
# Warmup: 20 iterations, 1 s each
# Measurement: 20 iterations, 1 s each

最佳答案

问题出在你的基准测试中:你是死代码消除的受害者。

JIT 编译器非常聪明,有时可以理解自动装箱的结果永远不会为 null,因此对于匿名类,它只是简单地删除了您的检查,这反过来又使循环体几乎为空。将其替换为不太明显的内容(对于 JIT),如下所示:

public void test(Long i) {
if (i == Long.MAX_VALUE) System.out.println("never");
}

并且您将观察到相同的性能(匿名类变得更慢,而 lambda 和方法引用的性能处于同一水平)。

出于某种原因,对于 lambda/方法引用,它没有进行相同的优化。但您不必担心:您不太可能在实际代码中拥有这种可以完全优化掉的方法。

一般来说@apangin 是正确的:改用 Blackhole。

关于java - 尝试对 lambda 性能进行基准测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34817754/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com