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注解进行标记,否则方法将被视为普通方法,并且不会对其执行基准测试。

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

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

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • eplan激活码破解步骤视频【中文破解版】

    (eplan激活码破解步骤视频)本文适用于JetBrains家族所有ide,包括IntelliJidea,phpstorm,webstorm,pycharm,datagrip等。https://javaforall.net/100143.htmlIntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,上面是详细链接哦~C…

    2022年3月26日
    213
  • goland-2022.01.13 激活码(注册激活)2022.02.24

    (goland-2022.01.13 激活码)本文适用于JetBrains家族所有ide,包括IntelliJidea,phpstorm,webstorm,pycharm,datagrip等。IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.net/100143.html…

    2022年4月1日
    471
  • 指纹解锁特效怎么做?2022最简单的教程来咯「建议收藏」

    指纹解锁特效怎么做?2022最简单的教程来咯「建议收藏」在视频模板的制作过程中我们是有机会用到手机解锁的动效的,AE怎么制作手机解锁动效呢?今天就来跟大家分享一波BeardChicken大神制作的极具炫酷以及科技感的手机解AE制作手机解锁动效教程1.在绘图软件中画好背景、指纹图标以及指纹上方的圆圈,将其导入到AE中,指纹和圆圈生成合成,然后将指纹解锁的光效也导入到AE中,并调整其位置缩放后调整到指纹上层;2.打开[展开“转换控制”窗格]和[展开“入点”“出点”“持续时间”“伸缩”窗格],降低[持续时间],勾选[剪切蒙版];.

    2022年8月10日
    6
  • cubieboard 用户 密码 root「建议收藏」

    cubieboard 用户 密码 root「建议收藏」因为不是超级用户root,所以你进行任何操作都要使用sudo在命令的前面。启用root的方法:sudopasswdroot输入新的root密码2次,确认后。就激活了root账户,就可以使用root登录,以后就具备了最高权限。先解除root锁定,为root用户设置密码#sudopasswdPassword:EnternewUNIXpasswo

    2022年7月22日
    15
  • Vue最简洁最全的入门教程

    Vue最简洁最全的入门教程最近在学vue,主要从以下几个方面学习:•环境安装•模板语法(怎么写)•指令•选项、生命周期(写在哪儿)•vuejs-devtools(怎么调试)1.Vue.js简介Vue.js是一套构建用户界面的UI框架,它专注于MVVM模型的ViewModel层,通过双向数据绑定把View层和Model层链接起来。2.Vue.js特点•模板双向绑定机制•利用指令…

    2022年5月4日
    47
  • Qt属性系统(Qt Property System)

    Qt提供了巧妙的属性系统,它与某些编译器支持的属性系统相似。然而,作为平台和编译器无关的库,Qt不能够依赖于那些非标准的编译器特性,比如__property或者[property]。Qt的解决方案

    2021年12月28日
    61

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

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