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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • request.getParameterValues()用法「建议收藏」

    request.getParameterValues()用法「建议收藏」本人前段也不怎么样,研究了很久终于弄明白了request.getParameterValues()的简单用法,希望以下的方案能帮你渡过难关&amp;amp;amp;amp;lt;formname=&amp;amp;amp;quot;checkform&amp;amp;amp;quot;method=&amp;amp;amp;quot;post&amp;amp;amp;quot;action=&amp;amp;amp;quot;getvalue.j

    2022年7月22日
    6
  • currentstyle 织梦_织梦arclist标签支持高亮currentstyle属性方法

    currentstyle 织梦_织梦arclist标签支持高亮currentstyle属性方法找到include/taglib/arclist.lib.php第一步:查找:$channelid=$ctag->GetAtt(‘channelid’);替换:$channelid=$ctag->GetAtt(‘channelid’);$currentstyle=$ctag->GetAtt(‘currentstyle’);第二步:查找:$ct…

    2022年7月14日
    13
  • FIREBIRD使用经验总结

    FIREBIRD使用经验总结

    2021年7月30日
    63
  • PHP验证邮箱地址代码

    PHP验证邮箱代码:functionisEmail($email){returnstrlen($email)>6&&preg_match("/^[\w\

    2021年12月20日
    62
  • C语言贪吃蛇代码_c语言贪吃蛇游戏

    C语言贪吃蛇代码_c语言贪吃蛇游戏一、C语言贪吃蛇代码实现前言设计贪吃蛇游戏的主要目的是让大家夯实C语言基础,训练编程思维,培养解决问题的思路,领略多姿多彩的C语言。贪吃蛇是非常经典的一款游戏,本次我们模拟在控制台实现贪吃蛇游戏,也就是实现贪吃蛇的基本功能,比如在地图中,用“↑↓←→”控制移动蛇的方向,吃掉食物之后,蛇身体会变长等等。。。。首先我们得分析,游戏中我们会碰见的一些情况。①蛇的部分,蛇的身子是一节一节的,此时最容易联想到的数据结构就是顺序表,链表,如果把蛇比做顺序表或者链表,在之后吃到食物的时候,身子肯定会变长,

    2022年9月4日
    3
  • Python中break和continue区别「建议收藏」

    Python中break和continue区别「建议收藏」break跳出整个循环,而continue跳出本次循环continue语句用来告诉python跳过当前循环,进行下一个循环break语句用来终止循环语句,即循环条件没有False条件或者序列还没被完全递归完,也会停止执行循环语句。break和continue语句用在while和for循环中#continue,跳过循环a=’2123456’forletterina:…

    2022年5月9日
    51

发表回复

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

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