Контрольное количество операций на итерацию JMH

Моя текущая установка:

    public void launchBenchmark() throws Exception {
    Options opt = new OptionsBuilder()
            .include(this.getClass().getName())
            .mode(Mode.Throughput) //Calculate number of operations in a time unit.
            .mode(Mode.AverageTime) //Calculate an average running time per operation
            .timeUnit(TimeUnit.MILLISECONDS)
            .warmupIterations(1)
            .measurementIterations(30)
            .threads(Runtime.getRuntime().availableProcessors())
            .forks(1)
            .shouldFailOnError(true)
            .shouldDoGC(true)
            .build();

    new Runner(opt).run();
}

Как я могу узнать/контролировать (если возможно) количество операций, выполняемых на тест?

И важно ли установить время прогрева и время измерения?

Спасибо.


person Xitrum    schedule 17.10.2016    source источник


Ответы (1)


Вы не можете контролировать количество операций на итерацию. Весь смысл JMH заключается в том, чтобы правильно измерить это число.

Вы можете настроить разминку, используя аннотацию:

@Warmup(iterations = 10, time = 500, timeUnit = MILLISECONDS)

И измерение по:

@Measurement(iterations = 200, time = 200, timeUnit = MILLISECONDS)

Просто установите соответствующие значения для вашего варианта использования

person Svetlin Zarev    schedule 17.10.2016
comment
а, понятно. У вас есть хорошее предложение по времени итерации? например если я знаю, что каждая операция будет стоить x времени. Тогда сколько времени я должен установить для каждой итерации? - person Xitrum; 17.10.2016
comment
Это зависит. С настройками по умолчанию JIT использует C1 для компиляции в исходное состояние после 10 000 итераций и использует C2 после 30 000 итераций. Таким образом, вы должны установить количество итераций и время итерации достаточно большими, чтобы убедиться, что JIT скомпилировал все с помощью компилятора C2, иначе ваш тест покажет неверную статистику. Если вы установите эти значения слишком высокими, это будет просто пустой тратой времени, но никаких других негативных последствий. - person Svetlin Zarev; 17.10.2016
comment
Кроме того, время итерации должно быть достаточно большим, чтобы компенсировать некоторое дрожание, но оно опять же зависит от того, сколько времени занимает операция. Например, если одна операция занимает 100 мс, то вам нужно время антерации как минимум в несколько секунд, но если это занимает наносекунду ->, то 100 мс будет более чем достаточно. - person Svetlin Zarev; 17.10.2016