JMH Micro Benchmark Аннотации со Scala

Я новичок в JMH. Я не очень понимаю, как это работает после запуска моего кода и использования различных аннотаций. Я использую итерацию = 1, разминку = 1, разветвление = 1, чтобы увидеть, что мой код будет выполнен один раз, но это не так. JMH запускает мой код более 100 000 раз, и я не знаю почему. Итак, как я могу контролировать количество раз, когда мой код вызывается? Вот мой код: (я исправляю JMHSample_01 для моего теста)

package org.openjdk.jmh.samples
import java.util.concurrent.TimeUnit
import org.openjdk.jmh.annotations._
@OutputTimeUnit(TimeUnit.MILLISECONDS)
@BenchmarkMode(Array(Mode.AverageTime))
@State(Scope.Thread)
@Warmup(iterations = 1, time = 1)
@Measurement(iterations = 1, time = 1)
@Fork(1)
class JMHSample_01_HelloWorld {

  @Benchmark
  def wellHelloThere(): Unit = {
    // this method was intentionally left blank.
    val a:Int =  1
    val b:Int = 2
    val c:Int = a + b
    println("this is c " + c)
  }

}

1 ответ

Решение

Вот как работает JMH: он выполняет ваш код десятки раз, чтобы узнать, каково среднее время выполнения. Java-программу нужно запускать много раз, прежде чем Java JIT-компилятор оптимизирует код. Бенчмарк обманывает JIT-компилятор, чтобы он считал метод эталона важным для его правильной оптимизации.

Ваш тест имеет много проблем: он детерминирован, где 1 + 2 всегда 3 если это то, что вы хотите измерить: это просто заменит вычисление на конечный результат.

Пожалуйста, посмотрите на образцы JMH, чтобы узнать, как правильно использовать JMH. В этом контексте он не играет большой роли в том, что ваши тесты написаны на Scala, поскольку он компилируется в байт-код Java.

Другие вопросы по тегам