Я написал два теста, чтобы продемонстрировать, что 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 DeadCodeTraps.summaryStatistics_standardDeviationForTenNumbers 0,359 ± 0,294
Почему JIT не оптимизирует его? Результат summaryStatistics.getStandardDeviation();
нигде вне метода не используется и им не возвращается.
(Я использую сборку OpenJDK 10.0.2+13-Ubuntu-1ubuntu0.18.04.4)
summaryStatistics.getStandardDeviation();
нигде не используется вне области действия метода и не возвращается, поэтому нет смысла сохранять этот код после JIT-оптимизации? Или, может быть, он хранит его, поскольку не может решить, есть ли у этого кода какие-либо побочные эффекты? - person ByeBye   schedule 14.01.2019