gpt4 book ai didi

java - JMH - 为什么 JIT 不消除我的死代码

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:37:42 26 4
gpt4 key购买 nike

我写了两个基准来证明 JIT 可能是编写好的基准的问题(请跳过我在这里不使用 @State):

@Fork(value = 1)
@Warmup(iterations = 2, time = 10)
@Measurement(iterations = 3, time = 2)
@BenchmarkMode(Mode.AverageTime)
public class DeadCodeTraps {

@Benchmark
@OutputTimeUnit(TimeUnit.MICROSECONDS)
public static void summaryStatistics_standardDeviationForFourNumbers() {
final SummaryStatistics summaryStatistics = new SummaryStatistics();
summaryStatistics.addValue(10.0);
summaryStatistics.addValue(20.0);
summaryStatistics.addValue(30.0);
summaryStatistics.addValue(40.0);
summaryStatistics.getStandardDeviation();
}

@Benchmark
@OutputTimeUnit(TimeUnit.MICROSECONDS)
public static void summaryStatistics_standardDeviationForTenNumbers() {
final SummaryStatistics summaryStatistics = new SummaryStatistics();
summaryStatistics.addValue(10.0);
summaryStatistics.addValue(20.0);
summaryStatistics.addValue(30.0);
summaryStatistics.addValue(40.0);
summaryStatistics.addValue(50.0);
summaryStatistics.addValue(60.0);
summaryStatistics.addValue(70.0);
summaryStatistics.addValue(80.0);
summaryStatistics.addValue(90.0);
summaryStatistics.addValue(100.0);
summaryStatistics.getStandardDeviation();
}

}

我以为JIT会消除死代码,所以会同时执行两个方法。但最后,我有:

summaryStatistics_standardDeviationForFourNumbers 0.158 ± 0.046DeadCodeTraps.summaryStatistics_standardDeviationForTenNumbers 0.359 ± 0.294

为什么JIT不优化呢? summaryStatistics.getStandardDeviation(); 的结果不会在该方法之外的任何地方使用,也不会由它返回。

(我使用的是 OpenJDK build 10.0.2+13-Ubuntu-1ubuntu0.18.04.4)

最佳答案

如果您谈论的是 Apache Commons Math SummaryStatistics类,那么这是一个庞大的类。它的构造肯定不会被内联。要查看原因,请运行 -XX:+UnlockDiagnosticVMOptions -XX:+PrintInlining -XX:-BackgroundCompilation

死代码消除发生在内联之后。未使用的对象将反向传播,但非内联构造函数将打破链条,因为 JIT 优化器无法再确保没有副作用。

换句话说,你期望被淘汰的代码太大了。

关于java - JMH - 为什么 JIT 不消除我的死代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54184932/

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