JMH入门

JMH入门1JMH介绍JMH是JavaMicroBenchmarkHarness的简写,是专门用于代码微基准测试的工具集(toolkit)。JMH是由实现Java虚拟机的团队开发的,因此他们非常清楚开发者所编写的代码在虚拟机中将会如何执行。由于现代JVM已经变得越来越智能,在Java文件的编译阶段、类的加载阶段,以及运行阶段都可能进行了不同程度的优化,因此开发者编写的代码在运行中未必会像自己所预期的那样具有相同的性能体现,JVM的开发者为了让普通开发者能够了解自己所编写的代码运行的情况,JMH便因此而生。

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

1 JMH介绍

JMH是Java Micro Benchmark Harness的简写,是专门用于代码微基准测试的工具集(toolkit)。JMH是由实现Java虚拟机的团队开发的,因此他们非常清楚开发者所编写的代码在虚拟机中将会如何执行。
由于现代JVM已经变得越来越智能,在Java文件的编译阶段、类的加载阶段,以及运行阶段都可能进行了不同程度的优化,因此开发者编写的代码在运行中未必会像自己所预期的那样具有相同的性能体现,JVM的开发者为了让普通开发者能够了解自己所编写的代码运行的情况,JMH便因此而生。

JMH的官网地址:地址

maven坐标:

<dependency>
    <groupId>org.openjdk.jmh</groupId>
    <artifactId>jmh-core</artifactId>
    <version>1.19</version>
</dependency>
<dependency>
    <groupId>org.openjdk.jmh</groupId>
    <artifactId>jmh-generator-annprocess</artifactId>
    <version>1.19</version>
    <scope>provided</scope>
</dependency>

2 JMH快速入门

对比一下ArrayList和LinkedList这两者的add方法在性能上的差异:

import org.openjdk.jmh.annotations.*;
import org.openjdk.jmh.runner.Runner;
import org.openjdk.jmh.runner.RunnerException;
import org.openjdk.jmh.runner.options.Options;
import org.openjdk.jmh.runner.options.OptionsBuilder;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.concurrent.TimeUnit;
/** * @author wyaoyao * @date 2021/4/13 18:02 */
@BenchmarkMode(Mode.AverageTime)
@OutputTimeUnit(TimeUnit.MICROSECONDS)
@State(Scope.Thread)
public class JMHExample01 { 

private final static String DATA = "DUMMY DATA";
private List<String> arrayList;
private List<String> linkedList;
@Setup(Level.Iteration)
public void setUp() { 

this.arrayList = new ArrayList<>();
this.linkedList = new LinkedList<>();
}
@Benchmark
public List<String> arrayListAdd() { 

this.arrayList.add(DATA);
return arrayList;
}
@Benchmark
public List<String> linkedListAdd() { 

this.linkedList.add(DATA);
return this.linkedList;
}
public static void main(String[] args) throws RunnerException { 

final Options opts = new OptionsBuilder()
.include(JMHExample01.class.getSimpleName())
.forks(1)
.measurementIterations(10)
.warmupIterations(10)
.build();
new Runner(opts).run();
}
}

运行输出:

# JMH version: 1.19
# VM version: JDK 1.8.0_275, VM 25.275-b01
# VM invoker: C:\Program Files\AdoptOpenJDK\jdk-8.0.275.1-hotspot\jre\bin\java.exe
# VM options: -javaagent:C:\Program Files\JetBrains\IntelliJ IDEA 2020.2.2\lib\idea_rt.jar=60744:C:\Program Files\JetBrains\IntelliJ IDEA 2020.2.2\bin -Dfile.encoding=UTF-8
# Warmup: 10 iterations, 1 s each
# Measurement: 10 iterations, 1 s each
# Timeout: 10 min per iteration
# Threads: 1 thread, will synchronize iterations
# Benchmark mode: Average time, time/op
# Benchmark: study.wyy.juc.jmh.JMHExample01.arrayListAdd
# Run progress: 0.00% complete, ETA 00:00:40
# Fork: 1 of 1
# Warmup Iteration   1: 0.019 us/op
# Warmup Iteration   2: 0.015 us/op
# Warmup Iteration   3: 0.016 us/op
# Warmup Iteration   4: 0.016 us/op
# Warmup Iteration   5: 0.023 us/op
# Warmup Iteration   6: 0.016 us/op
# Warmup Iteration   7: 0.016 us/op
# Warmup Iteration   8: 0.016 us/op
# Warmup Iteration   9: 0.015 us/op
# Warmup Iteration  10: 0.014 us/op
Iteration   1: 0.012 us/op
Iteration   2: 0.012 us/op
Iteration   3: 0.035 us/op
Iteration   4: 0.045 us/op
Iteration   5: 0.032 us/op
Iteration   6: 0.034 us/op
Iteration   7: 0.034 us/op
Iteration   8: 0.042 us/op
Iteration   9: 0.032 us/op
Iteration  10: 0.039 us/op
Result "study.wyy.juc.jmh.JMHExample01.arrayListAdd":
0.032 ±(99.9%) 0.017 us/op [Average]
(min, avg, max) = (0.012, 0.032, 0.045), stdev = 0.011
CI (99.9%): [0.015, 0.049] (assumes normal distribution)
# JMH version: 1.19
# VM version: JDK 1.8.0_275, VM 25.275-b01
# VM invoker: C:\Program Files\AdoptOpenJDK\jdk-8.0.275.1-hotspot\jre\bin\java.exe
# VM options: -javaagent:C:\Program Files\JetBrains\IntelliJ IDEA 2020.2.2\lib\idea_rt.jar=60744:C:\Program Files\JetBrains\IntelliJ IDEA 2020.2.2\bin -Dfile.encoding=UTF-8
# Warmup: 10 iterations, 1 s each
# Measurement: 10 iterations, 1 s each
# Timeout: 10 min per iteration
# Threads: 1 thread, will synchronize iterations
# Benchmark mode: Average time, time/op
# Benchmark: study.wyy.juc.jmh.JMHExample01.linkedListAdd
# Run progress: 50.00% complete, ETA 00:00:30
# Fork: 1 of 1
# Warmup Iteration   1: 0.559 us/op
# Warmup Iteration   2: 0.318 us/op
# Warmup Iteration   3: 0.344 us/op
# Warmup Iteration   4: 0.139 us/op
# Warmup Iteration   5: 0.295 us/op
# Warmup Iteration   6: 0.096 us/op
# Warmup Iteration   7: 0.101 us/op
# Warmup Iteration   8: 0.097 us/op
# Warmup Iteration   9: 0.102 us/op
# Warmup Iteration  10: 0.098 us/op
Iteration   1: 0.285 us/op
Iteration   2: 0.094 us/op
Iteration   3: 0.280 us/op
Iteration   4: 0.091 us/op
Iteration   5: 0.279 us/op
Iteration   6: 0.092 us/op
Iteration   7: 0.100 us/op
Iteration   8: 0.294 us/op
Iteration   9: 0.094 us/op
Iteration  10: 0.108 us/op
Result "study.wyy.juc.jmh.JMHExample01.linkedListAdd":
0.172 ±(99.9%) 0.147 us/op [Average]
(min, avg, max) = (0.091, 0.172, 0.294), stdev = 0.097
CI (99.9%): [0.025, 0.319] (assumes normal distribution)
# Run complete. Total time: 00:01:28
Benchmark                   Mode  Cnt  Score   Error  Units
JMHExample01.arrayListAdd   avgt   10  0.032 ± 0.017  us/op
JMHExample01.linkedListAdd  avgt   10  0.172 ± 0.147  us/op

目前我们只需要查看输出的最后两行,大体上,我们从这两行信息可以发现arrayListAdd方法的调用平均响应时间为0.032微秒,误差在0.017微秒,而linkedListAdd方法的调用平均响应时间为0.172微秒,误差在0.147微秒

3 相关注解解释

3.1 @Benchmark注解标记基准测试方法

与Junit4.x版本需要使用@Test注解标记单元测试方法一样,JMH对基准测试的方法需要使用@Benchmark注解进行标记,否则方法将被视为普通方法,并且不会对其执行基准测试。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/157721.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • STM32项目设计:基于STM32F4的电子阅读器制作教程[通俗易懂]

    STM32项目设计:基于STM32F4的电子阅读器制作教程[通俗易懂]基于STM32F4的电子阅读器一、项目功能要求项目说明:项目偏软件,但是要依赖于自己对硬件的熟悉和驱动才能完成用到的主要技术:SD卡驱动(难–不过可移植SD卡驱动细节可在用完再了解其驱动协议)FatFs文件系统移植使用LCD屏驱动(加载字库文件做字库在LCD上的显示)功能要求:开机Logo电子书列表扫描电子书列表显示及小说选择菜单阅读功能:字体选择字体大小选择字体颜色设置阅读背景设置书签设置能够记录每本电子书的退出时处于什么阅读位置下

  • Java中&&和&以及||和|的区别「建议收藏」

    Java中&&和&以及||和|的区别「建议收藏」在java的逻辑运算符中,有这么四类:&amp;&amp;(短路与),&amp;(与),|(或),||(短路或)。&amp;&amp;和&amp;都是表示与,区别是&amp;&amp;只要满足第一个条件,后面条件就不再判断。而&amp;要对所有的条件都进行判断。看下面的程序:“&amp;”操作:publicclassOperateDemo01{/**验证"与"…

  • 哈佛幸福课-幸福笔记

    哈佛幸福课-幸福笔记幸福笔记“我是真的什么都有,我就是想有什么我都可以买什么,但是我居然这么痛苦,所以我就知道了这个幸福跟这个钱多少真的是没关系,而且钱多的话或者名气大,如果成功,如果你没有管理好你自己往往更容易让你陷入精神的痛苦。”-张朝阳接受杨澜采访时说脑子里经常闪过一些天真的想法,比如:如果我有张朝阳那样的成就和财富,就一定会一辈子开开心心没有烦恼亚克西。虽然非常愚蠢,但我们往往还是会把

  • 请说下封装 vue 组件的过程?_vue 自己封装过哪些通用组件

    请说下封装 vue 组件的过程?_vue 自己封装过哪些通用组件vue3封装组件发布到npm上

  • 线程死锁的原因及解决方法_多线程队列

    线程死锁的原因及解决方法_多线程队列很久之前就听过互联架构中有三高,高可用、高并发、高性能,多线程是处理高并发问题的基石,起步阶段一定要对线程有一个系统深刻的印象,为以后做准备

    2022年10月15日
  • 关闭networkmanager服务_电脑不小心禁用了无线网络怎么办

    关闭networkmanager服务_电脑不小心禁用了无线网络怎么办NetworkManager服务是管理和监控网络设置的守护进程,CentOS7更加注重使用NetworkManager服务来实现网络的配置和管理它是一个动态的,事件驱动的网络管理服务。常用管理命令:查看#systemctlstatusNetworkManager开启#systemctlstartNetworkManager关闭#systemctlstopNetworkManager不可用#systemctldisableNetworkManager可用#

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号