Думаю, я понимаю разницу между 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 val 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?
Вот что выдает JMH при запуске задачи:
> Task :lib:runBenchmark
# Detecting actual CPU count: 8 detected
# JMH version: 1.37
# VM version: JDK 19.0.1, OpenJDK 64-Bit Server VM, 19.0.1+10-21
# VM invoker: /opt/jdk-19.0.1/bin/java
# VM options: -Dfile.encoding=UTF-8 -Duser.country=US -Duser.language=en -Duser.variant
# Blackhole mode: compiler (auto-detected, use -Djmh.blackhole.autoDetect=false to disable)
# Warmup:
# Measurement: 1 iterations, 1 s each
# Timeout: 10000 ms per iteration
# Threads: 8 threads
# Benchmark mode: Single shot invocation time
# Benchmark: org.kepocnhh.jmh.FooBenchmark.fooBenchmark
Подробнее здесь: https://stackoverflow.com/questions/798 ... in-java-mi
В чем именно разница между AverageTime и SingleShotTime в Java Microbenchmark Harness? ⇐ JAVA
Программисты JAVA общаются здесь
1763755986
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 val 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?
Вот что выдает JMH при запуске задачи:
> Task :lib:runBenchmark
# Detecting actual CPU count: 8 detected
# JMH version: 1.37
# VM version: JDK 19.0.1, OpenJDK 64-Bit Server VM, 19.0.1+10-21
# VM invoker: /opt/jdk-19.0.1/bin/java
# VM options: -Dfile.encoding=UTF-8 -Duser.country=US -Duser.language=en -Duser.variant
# Blackhole mode: compiler (auto-detected, use -Djmh.blackhole.autoDetect=false to disable)
# Warmup:
# Measurement: 1 iterations, 1 s each
# Timeout: 10000 ms per iteration
# Threads: 8 threads
# Benchmark mode: Single shot invocation time
# Benchmark: org.kepocnhh.jmh.FooBenchmark.fooBenchmark
Подробнее здесь: [url]https://stackoverflow.com/questions/79818242/what-exactly-is-the-difference-between-averagetime-and-singleshottime-in-java-mi[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия