2016-10-17 12 views
1

Моя текущая настройка:Контролирует работы на одну итерацию 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(); 
} 

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

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

спасибо.

ответ

3

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

Вы можете настроить прогрев с помощью аннотации:

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

И измерение с помощью:

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

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

+0

ааа я вижу. У вас есть хорошее предложение на время итерации? например если я знаю, что каждая операция будет стоить х времени. Тогда сколько времени я должен установить для каждой итерации? – Xitrum

+0

Всё зависит от: С настройками по умолчанию JIT использует C1 для компиляции в native после 10k итераций и использует C2 после 30k. Таким образом, вы должны установить количество итераций и время итерации, достаточное для того, чтобы JIT скомпилировал все, используя компилятор C2, иначе ваш тест будет сообщать о неправильной статистике. Если вы установите слишком высокие значения, это будет пустой тратой времени, но никакого другого отрицательного эффекта. –

+0

Также время итерации должно быть достаточно большим, чтобы компенсировать некоторый джиттер, но это снова зависит от продолжительности операции. Например, если сингл-эоперация занимает 100 мс, тогда вам потребуется время анизера на несколько секунд, но если потребуется наносекунда ->, то 100 мс будет более чем достаточно –