Установка и демонтаж JMH

Я создал класс. В этом классе у меня есть несколько методов, помеченных как @Benchmark. У меня также есть основной метод, который запускает тесты JMH:

System.out.println("NUMBER OF THREADS: "+numOfThreads);
Options opt = new OptionsBuilder()
        .include(JMHtopToBottom.class.getSimpleName())
        .warmupIterations(5)
        .measurementIterations(3)
        .forks(numOfThreads)
        .build();

Collection<RunResult> collection = new Runner(opt).run();

Мой интерес состоит в том, чтобы иметь:

  1. метод установки, который запускает только один метод — сразу после new Runner(opt).run(); и перед вызовом всех @Benchmark методов (вместе с их повторениями).

  2. Кроме того, иметь метод tear down, который запускается только один раз сразу после запуска всех методов и до того, как мы вернемся к основному.

Когда я попробовал @setup и @tear_downLevel support: Trial/Iteration/Invocation) методы запускаются несколько раз и не один раз, как хотелось бы. Есть ли способ в JMH аннотировать методы, чтобы он запускал только один - сразу после run() и прямо перед окончанием run()?


jmh
person TaliG    schedule 25.02.2016    source источник
comment
Привет. Я не знаю, что это возможно. Может быть, это поможет, если вы укажете, зачем вам нужна эта конструкция. Затем другие могут предложить вам альтернативные подходы или даже сказать, что вы не должны так поступать.   -  person Matthias Huber    schedule 25.02.2016
comment
Эй, мне это нужно, чтобы построить матрицу, в которую будут записываться все методы. При разборке я хочу распечатать эту матрицу. Если компилятор снова и снова будет вызывать разрыв, он переопределит файл, который я печатаю для записи.   -  person TaliG    schedule 25.02.2016
comment
См.: stackoverflow.com/questions/33790799/   -  person Aleksey Shipilev    schedule 26.02.2016


Ответы (1)


Вам не хватает нескольких вещей:

  1. Форки — это не потоки, это отдельные процессы, запускаемые для запуска каждого теста. То есть, если вы установите вилки на 5, любой тест (в выбранном наборе тестов) будет запускаться 5 раз, каждый раз на отдельной виртуальной машине.
  2. Если forks=0 (не рекомендуется, так как отсутствует изоляция тестов, смешанные профили компиляции и т. д., предназначенные в основном для отладки), все тесты выполняются в отдельных процессах. Таким образом, каждая «пробная» установка/разборка для данного эталонного теста будет выполняться один раз для этой JVM. Нет общего контекста Suite.

Если вам абсолютно необходим некоторый контекст уровня «Suite», вам придется создать его из виртуальной машины (например, какой-то файл, который читается при настройке теста / обновляется при разборке и т. Д.).

person Nitsan Wakart    schedule 28.02.2016