Первый разогрев намного быстрее, чем в среднем

У меня есть очень простой микротест

@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

Игра с количеством форков или потоков, похоже, не имеет значения.

Итак, похоже, что какая-то оптимизация возвращается, но я не могу найти, что это такое.

Является ли снижение производительности результатом проблемы с моим эталонным тестом или эта деоптимизация отражает то, что произойдет в реальном приложении?

Примечание: это продолжение Есть ли какое-либо преимущество в вызове map после mapToInt, когда это необходимо?


person assylias    schedule 09.09.2015    source источник
comment
Я считаю, что это та же проблема, что и здесь.   -  person Tagir Valeev    schedule 09.09.2015
comment
У вас вполне может быть деоптимизация или перекомпиляция — вот почему фазы прогрева важны, чтобы это произошло раньше (см. правило 5) окончательные измерения. Что касается репрезентативности этой деоптимизации того, что произойдет в реальном приложении: это микротест, вполне возможно, что он совсем не репрезентативен для того, что произойдет в реальном приложении с помощью время, когда вы заполнили кеш вашего процессора другими вещами и т. д. и т. д. (хотя это может быть полезно и по-другому).   -  person Andy Brown    schedule 09.09.2015
comment
@TagirValeev Похоже, это действительно так.   -  person assylias    schedule 09.09.2015
comment
@assylias, не волнуйтесь, эта производительность на первой итерации по-прежнему не связана с производительностью в реальном приложении. В реальном приложении ваш профиль типа загрязнен, поэтому полное встраивание в любом случае будет невозможно. Написать правильный тест JMH с использованием потокового API не так уж и просто.   -  person Tagir Valeev    schedule 09.09.2015
comment
@TagirValeev Оптимизация возвращается примерно через 30 прогонов. Произойдет ли это в реальном мире или нет, действительно трудно сказать...   -  person assylias    schedule 09.09.2015