java – JMH – 为什么JIT不能消除我的死代码
发布时间:2020-12-15 08:28:32 所属栏目:Java 来源:网络整理
导读:我写了两个基准来证明JIT可能是编写精细基准测试的问题(请跳过我在这里不使用@State): @Fork(value = 1)@Warmup(iterations = 2,time = 10)@Measurement(iterations = 3,time = 2)@BenchmarkMode(Mode.AverageTime)public class DeadCodeTraps { @Benchmark
我写了两个基准来证明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.046 为什么JIT不优化它? summaryStatistics.getStandardDeviation()的结果;在方法之外的任何地方都不使用它,它不会被返回. (我使用的是OpenJDK build 10.0.2 13-Ubuntu-1ubuntu0.18.04.4) 解决方法
如果您正在谈论Apache Commons Math
SummaryStatistics 课程,那么这是一个庞大的课程.它的结构肯定不会被内联.要查看原因,请使用-XX:UnlockDiagnosticVMOptions -XX:PrintInlining -XX:-BackgroundCompilation
内联后消除死代码. 换句话说,您希望被淘汰的代码太大了. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |