gpt4 book ai didi

java - 为什么 Java 使用包含 X 的外部变量的函数比直接使用 X 更快?

转载 作者:行者123 更新时间:2023-11-29 02:58:36 25 4
gpt4 key购买 nike

所以我制定了以下基准测试来尝试了解 Lambas 如何影响性能。

@Fork(1)
@Measurement(iterations = 5)
@Warmup(iterations = 5)
public class LambdaBenchmark {

@State(Scope.Thread)
public static class MyInteger {
public Integer value = 10;
}

@Benchmark
public void TestValueInside(MyInteger integer) {
Function<Integer, Integer> toTest = i -> i + 10;
toTest.apply(1);
}

@Benchmark
public void TestValueOutside(MyInteger integer) {
Function<Integer, Integer> toTest = i -> i + integer.value;
toTest.apply(1);
}

@Benchmark
public void TestValueOutsideFinal(MyInteger integer) {
int i2 = 10;
Function<Integer, Integer> toTest = i -> i + i2;
toTest.apply(1);
}

@Benchmark
public void TestValueOutsideLocalCopy(MyInteger integer) {
int i2 = integer.value;
Function<Integer, Integer> toTest = i -> i + i2;
toTest.apply(1);
}
}

我对结果有点困惑:

Benchmark                                   Mode  Cnt           Score           Error  Units
LambdaBenchmark.TestValueInside thrpt 5 1494683335,686 ▒ 157769032,327 ops/s
LambdaBenchmark.TestValueOutside thrpt 5 755197977,631 ▒ 39587849,696 ops/s
LambdaBenchmark.TestValueOutsideFinal thrpt 5 3007751583,191 ▒ 178696557,885 ops/s
LambdaBenchmark.TestValueOutsideLocalCopy thrpt 5 771307179,267 ▒ 13613431,113 ops/s

为什么 TestValueOutsideFinalTestValueInside 快这么多?我们正在使用一个可能被认为是 final 的外部变量,但它仍然是一个变量而不是直接值?还是值 10 不断被重新创建而不是总是使用相同的寻址变量?

编辑:

考虑到@AlBlue 所说的内容后,它确实显示出更接近的结果。

这是我返回每个值后的结果:

Benchmark                                   Mode  Cnt          Score          Error  Units
LambdaBenchmark.TestValueInside thrpt 5 309129197,389 ▒ 32089680,994 ops/s
LambdaBenchmark.TestValueOutside thrpt 5 283435336,319 ▒ 52230809,938 ops/s
LambdaBenchmark.TestValueOutsideFinal thrpt 5 360590518,854 ▒ 3072257,599 ops/s
LambdaBenchmark.TestValueOutsideLocalCopy thrpt 5 279159794,477 ▒ 12871790,409 ops/s

最佳答案

您的代码陷入了基准测试中最古老的问题:您忽略了方法的结果。结果,一切都被丢弃了,您正在测量随机数据。

总是,总是,总是从函数调用中返回值,或者用 Blackhole.consume 消耗它。否则,您将无法获得预期的测量结果。

关于java - 为什么 Java 使用包含 X 的外部变量的函数比直接使用 X 更快?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36643623/

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