6

我有一个非常简单的微基准

@State(Scope.Benchmark)
@BenchmarkMode(Mode.AverageTime)
public class Test {

  List<Integer> list =  new Random().ints(100_000).boxed().collect(toList());

  @Benchmark public int mapToInt() {
    return list.stream().mapToInt(x -> x * x).sum();
  }
}

当我运行它时,我总是得到第一次热身运行比下一次运行快得多的结果:

# Warmup Iteration   1: 171.596 us/op
# Warmup Iteration   2: 689.337 us/op
....
Iteration   1: 677.625 us/op
....

命令行:

java -jar target/benchmarks.jar .*Test.* -wi 5 -w 1000ms -i 10 -r 1000ms -t 1 -f 5 -tu us

使用分叉或线程的数量似乎没有什么区别。

所以看起来一些优化被恢复了,但我找不到它是什么。

性能下降是由于我的基准测试问题还是这种去优化代表了实际应用程序中会发生的情况?

注意:这是在 mapToInt 之后调用 map 的后续操作,在需要的地方调用 map 有什么好处吗?

4

0 回答 0