我有一个非常简单的微观基准
@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
使用分叉或线程的数量似乎没有什么区别。
所以看起来某些优化会被恢复,但我找不到它是什么。
由于我的基准测试问题导致性能下降,还是这种去优化代表了真实应用中会发生什么?
注意:这是Is there any advantage of calling map after mapToInt, where ever required?
的后续行动