В чем именно разница между AverageTime и SingleShotTime в Java Microbenchmark Harness?JAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 В чем именно разница между AverageTime и SingleShotTime в Java Microbenchmark Harness?

Сообщение Anonymous »

Думаю, я понимаю разницу между AverageTime и Throughput.
Предположим, у нас есть метод со следующими аннотациями:

Код: Выделить всё

@Benchmark
@Fork(value = 1, warmups = 0)
@Measurement(iterations = 1, time = 1, timeUnit = TimeUnit.SECONDS)
Если я использую @BenchmarkMode(Mode.AverageTime), JMH запустит один форк (потому что @Fork(value = 1)), выполнит одну итерацию (потому что @Measurement(iterations = 1)) и выполнит метод fooBenchmark столько раз, сколько он сможет завершить вызовы (JMH называет его Level.Invoction в org.openjdk.jmh.annotations) полностью не менее чем за одну секунду (потому что @Measurement(time = 1, timeUnit = TimeUnit.SECONDS)).
Мы делим затраченное время на вызовы.
Это дает среднее время на один вызов.
Если я использую @BenchmarkMode(Mode.Throughput), мы делим количество завершенных вызовов за истекшее время.
Это дает нам пропускную способность.
Предположим, у нас есть тестовый класс с состоянием Foo:

Код: Выделить всё

@State(Scope.Benchmark)
internal open class FooBenchmark {
class Foo {
private val values = mutableListOf()

fun add() = values.add(values.size.toString())

fun size() = values.size
}

private var foo = Foo()

@Setup(Level.Invocation)
fun eachInvocation() {
foo = Foo()
}

@Benchmark
@Fork(value = 1, warmups = 0)
@Measurement(iterations = 1, time = 1, timeUnit = TimeUnit.SECONDS)
@BenchmarkMode(Mode.SingleShotTime)
fun fooBenchmark(hole: Blackhole) {
check(foo.size() == 0)
foo.add()
check(foo.size() == 1)
hole.consume(foo)
}
}
Когда я использую @BenchmarkMode(Mode.SingleShotTime), я ожидаю, что JMH выполнит ровно один вызов и измерит время именно этого одного вызова.
Но для меня, для SingleShotTime, JMH вызывает метод fooBenchmark несколько раз.
1 ответвление, 1 итерация, но несколько вызовов.
И он использует один и тот же экземпляр. класса FooBenchmark в разных потоках.
Это приводит к конфликту при доступе к состоянию foo.
Это всего лишь пример того, как определенно происходят множественные вызовы. Мне НЕ нужен доступ к данным из разных потоков.
Я не понимаю, как работает каждый из режимов JMH? Или я неправильно настроил режим SingleShotTime?

Подробнее здесь: https://stackoverflow.com/questions/798 ... in-java-mi
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»