Java基准测试工具JMH详解

Java基准测试工具JMH详解Java基准测试工具JMH详解1.JMH简介1.1JMH概念1.2JMH与JMeter区别1.3JMH注解说明2.JMH使用2.1创建项目2.2引入依赖2.3启动异常解决2.4JMH案例11.JMH简介1.1JMH概念JMHisaJavaharnessforbuilding,running,andanalysingnano/micro/milli/macrobenchmarkswritteninJavaandotherlanguagestargett

大家好,又见面了,我是你们的朋友全栈君。

1.JMH概述

1.1 JMH简介

JMH is a Java harness for building, running, and analysing nano/micro/milli/macro benchmarks written in Java and other languages targetting the JVM.
JMH是一种Java工具,用于构建、运行和分析用Java和其他针对JVM的语言编写的nano/micro/mili/macro基准测试。

JMH 是 OpenJDK 团队开发的一款基准测试工具,一般用于代码的性能调优,精度甚至可以达到纳秒级别,适用于 java 以及其他基于 JVM 的语言。和 Apache JMeter 不同,JMH 测试的对象可以是任一方法,颗粒度更小,而不仅限于rest api。

官方地址:http://openjdk.java.net/projects/code-tools/jmh/
官网案例:http://hg.openjdk.java.net/code-tools/jmh/file/tip/jmh-samples/src/main/java/org/openjdk/jmh/samples/

1.2 JMH与JMeter区别

JMeter更多是对rest api接口进行压测,可以通过设置参数编写脚本实现模拟并发场景进行单模块或者是整个链路进行压测。
而JMH关注的是某一段代码或者是某个方法在jvm中执行的效率,颗粒度更细,可以使用 JMH 对优化的效果进行定量的分析。

1.3 JMH注解说明

在运行时,注解配置被用于解析生成BenchmarkListEntry配置类实例。
一个方法对应一个@Benchmark注解,一个@Benchmark注解对应一个基准测试方法。
注释在类上的注解,或者注释在类的字段上的注解,则是类中所有基准测试方法共用的配置。

@Benchmark声明一个public方法为基准测试方法。
@BenchmarkMode通过JMH我们可以轻松的测试出某个接口的吞吐量、平均执行时间等指标的数据(假设我想测试testGson方法的平均耗时,那么可以使用@BenchmarkMode注解指定测试维度为Mode.AverageTime。)

@Measurement测量次数
@Measurement假设我想测量testGson方法五次,那么可以使用@Measurement注解。

@Warmup配置预热参数。
为了数据准确,我们可能需要让testGson方法做下热身运动。如在方法中创建GsonParser对象,预热可以避免首次创建GsonParser时因多了类加载的耗时而导致测试结果不准备的情况。jvm使用JIT即时编译器,一定的预热次数可让JIT对testGson方法的调用链路完成编译,去掉解释执行对测试结果的影响。

@OutputTimeUnit
OutputTimeUnit注解用于指定输出的方法执行耗时的单位。如果方法执行耗时为秒级别,为了便于 观察结果,我们可以使用@OutputTimeUnit指定输出的耗时时间单位为秒;如果方法执行耗时为毫秒级别,为了便于观察结果,我们可以使用@OutputTimeUnit指定输出的耗时时间单位为毫秒,否则使用默认的秒做单位,会输出10的负几次方这样的数字,不太直观。

@Fork用于指定fork出多少个子进程来执行同一基准测试方法。假设我们不需要多个进程,那么 可以使用@Fork指定为进程数为1。

@Threads注解用于指定使用多少个线程来执行基准测试方法,如果使用@Threads指定线程数为2,那么每次测量都会创建两个线程来执行基准测试方法。

2.JMH验证

2.1 创建项目

创建一个基准测试项目,基本的Maven项目引入jmh依赖,jmh包括两部分jmh-core与jmh-generator-annprocess。

2.2 引入依赖

<!--JMH-->
<!-- https://mvnrepository.com/artifact/org.openjdk.jmh/jmh-core -->
<dependency>
    <groupId>org.openjdk.jmh</groupId>
    <artifactId>jmh-core</artifactId>
    <version>1.33</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.openjdk.jmh/jmh-generator-annprocess -->
<dependency>
    <groupId>org.openjdk.jmh</groupId>
    <artifactId>jmh-generator-annprocess</artifactId>
    <version>1.33</version>
    <scope>provided</scope>
</dependency>

2.3 启动异常解决

关于JMH运行ERROR: transport error 202: connect failed: Connection refused ERROR解决。
网上有很多说法,又是插件引入,又是idea配置,实际上你应该是启动的debug模式,换成run模式就行。

2.4 JMH案例

/** * JMH案例1 * * @author zrj * @since 2021/10/9 **/
public class JMHSample_01_HelloWorld { 
   
    @Benchmark
    @BenchmarkMode(Mode.Throughput)
    @Warmup(iterations = 3)
    @Measurement(iterations = 3, time = 5, timeUnit = TimeUnit.SECONDS)
    @Threads(1)
    @Fork(1)
    @OutputTimeUnit(TimeUnit.SECONDS)
    public void wellHelloThere() throws InterruptedException { 
   
        Thread.sleep( 1000 );
    }

    /** * JMH的基础配置 * include:benchmark所在类的名字,可以使用正则表达 * warmupIteration:预热的迭代次数,这里为什么要预热的原因是由于JIT的存在,随着代码的运行,会动态对代码的运行进行优化。因此在测试过程中需要先预热几轮,让代码运行稳定后再实际进行测试 * measurementIterations:实际测试轮次 * output:测试报告输出位置,不配置则输出到控制台。 */
    public static void main(String[] args) throws RunnerException { 
   
        Options opt = new OptionsBuilder()
                .include( JMHSample_01_HelloWorld.class.getSimpleName() )
                .forks( 1 )
                .build();
        new Runner( opt ).run();

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

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

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

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

(0)


相关推荐

  • 借你一双慧眼,识别代码安全审计工具「建议收藏」

    借你一双慧眼,识别代码安全审计工具「建议收藏」代码安全审计产品、代码缺陷分析产品、代码安全分析等基于源代码静态分析技术的产品市场上越来越多,但是质量却层次不齐,误报率非常高,漏报率也不低,究其原因是为什么呢?因为一款静态分析类产品研发不是轻松的事,往往要经历几年时间,产品才会逐渐成熟,支持的开发语言和安全漏洞类型才能达到企业级应用水平,一般中小企业是很难投入如此长的时间进行研发的,而且静态分析类产品底…

  • 小程序列表跳转至详情_小程序相互跳转的方法

    小程序列表跳转至详情_小程序相互跳转的方法效果展示:列表页js部分:onLoad:function(options){varthat=this;wx.request({url:’你的接口’,data:{ 接口参数},header:{‘content-type’:’ap…

  • springboot+dynamicDataSource动态添加切换数据源

    springboot+dynamicDataSource动态添加切换数据源

  • java script 下载_JavaScript下载[通俗易懂]

    java script 下载_JavaScript下载[通俗易懂]JavascriptPlus是一个小巧的Javascript脚本辅助编程工具,主要方便开发者对js代码进行测试、预览以及运行等操作,特点包括用不同的颜色显示语法和关键词,有稍许的程序输入预测功能,测试运行子程序等等。JavascriptPlus是一款功能强劲的javascript文本编辑器。内置的智能系统能够提示你-各种Javascript物件、性质和触发事件,-各种Html和Shee…

  • linux怎么查看jdk的安装版本和安装路径_yum查看已安装的软件

    linux怎么查看jdk的安装版本和安装路径_yum查看已安装的软件打开终端,输入java-version即可显示当前系统的jdk版本打开终端,输入java-verbose即可显示当前系统的jdk的安装位置

  • Vue基础知识总结 11:前端路由vue-router

    Vue基础知识总结 11:前端路由vue-router一、前端路由vue-router1、维基百科路由就是通过互联的网络把信息从源地址传输到目的地址的活动。2、路由的机制路由包括路由和转发。路由器->公网IP->映射表->内网IP映射表:[内网ip1:电脑标识1,内网ip2:电脑标识2]3、后端渲染JSP:javaserverpage后端渲染==html+css+javajava代码的作用是从数据库中读取数据,然后将他们动态的放在页面中。后端渲染的意思就是,前端请求后端,

发表回复

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

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