Я играю с jmh
, а в разделе looping они сказали, что
Вы можете заметить, что чем больше количество повторений, тем ниже "воспринимаемая" стоимость измеряемой операции. До такой степени мы делать каждое дополнение с 1/20 нс, намного больше, чем оборудование может на самом деле делать. Это происходит потому, что цикл сильно разворачивается/конвейерно, и измеряемая операция поднимается из цикла. Мораль: не overuse loops, полагайтесь на JMH, чтобы получить правильное измерение.
Я сам это пробовал
@Benchmark
@OperationsPerInvocation(1)
public int measurewrong_1() {
return reps(1);
}
@Benchmark
@OperationsPerInvocation(1000)
public int measurewrong_1000() {
return reps(1000);
}
и получил следующий результат:
Benchmark Mode Cnt Score Error Units
MyBenchmark.measurewrong_1 avgt 15 2.425 ± 0.137 ns/op
MyBenchmark.measurewrong_1000 avgt 15 0.036 ± 0.001 ns/op
Это действительно показывает, что MyBenchmark.measurewrong_1000
значительно быстрее, чем MyBenchmark.measurewrong_1
. Но я не могу понять оптимизацию JVM, чтобы сделать это улучшение производительности.
Что они означают, что цикл разворачивается/конвейерно?