JMH 性能测试分析工具

JMH 性能测试分析工具一什么是JMHJMH是在method层面上的benchmark,精度可以精确到微秒级,是对热点函数进行优化时,对优化结果进行定量分析的工具。二JMH的应用场景典型场景:想定量地知道某个函数需要执行多长时间,以及执行时间和输入n的相关性。 一个函数有多种不同的实现,针对多种不同的实现,需要定量分析出那种实现性能更好。三JMH的使用3.1引入依赖<properties><jmh.version>1.14.1&…

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

一 什么是 JMH

       JMH 是在 method 层面上的 benchmark,精度可以精确到微秒级,是对热点函数进行优化时,对优化结果进行定量分析的工具

二 JMH 的应用场景

典型场景:

  • 想定量地知道某个函数需要执行多长时间,以及执行时间和输入 n 的相关性。
  • 一个函数有多种不同的实现,针对多种不同的实现,需要定量分析出那种实现性能更好。

三 JMH 的使用

3.1 引入依赖

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

3.2 使用介绍

下面样例是比较一下 AtomicLong 和 LongAdder 的性能:

package com.sb.springbootjmh;

import org.openjdk.jmh.annotations.*;
import org.openjdk.jmh.runner.Runner;
import org.openjdk.jmh.runner.options.Options;
import org.openjdk.jmh.runner.options.OptionsBuilder;

import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicLong;
import java.util.concurrent.atomic.LongAdder;

@OutputTimeUnit(TimeUnit.MICROSECONDS)
@BenchmarkMode(Mode.Throughput)
@State(Scope.Thread)
public class Main {
    private static AtomicLong count = new AtomicLong();
    private static LongAdder longAdder = new LongAdder();
    public static void main(String[] args) throws Exception {
        Options options = new OptionsBuilder()
                .include(Main.class.getName())
                .forks(1)
                .warmupIterations(5)
                .measurementIterations(5)
                .build();
        new Runner(options).run();
    }

    @Benchmark
    @Threads(10)
    public void run0(){
        count.getAndIncrement();
    }

    @Benchmark
    @Threads(10)
    public void run1(){
        longAdder.increment();
    }
}

得到如下结果:

JMH 性能测试分析工具

3.3 JMH注解说明

@Benchmark

       表示该方法是需要进行 benchmark 的对象,用法和 JUnit 的 @Test 类似。其中 Mode 有四种选择:

  • Throughput: 整体吞吐量,例如“1秒内可以执行多少次调用”。
  • AverageTime: 调用的平均时间,例如“每次调用平均耗时xxx毫秒”。
  • SampleTime: 随机取样,最后输出取样结果的分布,例如“99%的调用在xxx毫秒以内,99.99%的调用在xxx毫秒以内”
  • SingleShotTime: 以上模式都是默认一次 iteration 是 1s,唯有 SingleShotTime 是只运行一次。往往同时把 warmup 次数设为0,用于测试冷启动时的性能。

@State

   State 用于声明某个类是一个“状态”,然后接受一个 Scope 参数用来表示该状态的共享范围。因为很多 benchmark 会需要一些表示状态的类,JMH 允许你把这些类以依赖注入的方式注入到 benchmark 函数里。Scope 主要分为两种。

  • Thread: 该状态为每个线程独享。
  • Benchmark: 该状态在所有线程间共享。

@OutputTimeUnit

       benchmark 结果所使用的时间单位。

3.4 JMH 启动参数说明

Options options = new OptionsBuilder()
                .include(Main.class.getName())
                .forks(1)
                .warmupIterations(5)
                .measurementIterations(5)
                .build();
  • include

       benchmark 所在的类的名字,注意这里是使用正则表达式对所有类进行匹配的。

  • fork

       进行 fork 的次数。如果 fork 数是2的话,则 JMH 会 fork 出两个进程来进行测试。

  • warmupIterations

       预热的迭代次数。

  • measurementIterations

       实际测量的迭代次数。

四 参考说明

    本文只是简单的介绍 JMH 的使用,要想深入了解请参考如下链接:

   官网:http://hg.openjdk.java.net/code-tools/jmh/file/tip/jmh-samples/src/main/java/org/openjdk/jmh/samples/

    https://blog.dyngr.com/blog/2016/10/29/introduction-of-jmh/

    https://www.jianshu.com/p/67a75e36166f

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

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

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

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

(0)
blank

相关推荐

  • linux服务器安装路径及基本命令[通俗易懂]

    linux服务器安装路径及基本命令[通俗易懂]Nginx安装安装路径 /usr/local/nginx配置文件 /usr/local/nginx/conf/nginx.conf启动:进入到/usr/local/nginx/sbin下,./nginx关闭:进入到/usr/local/nginx/sbin下 ./nginx -s stop 重启:同上, -s reload停止 kill -9 线程号查看 ps -ef|grep nginxhttps://www.jianshu.com/p/9f2c162ac77c 可参考安装ng

  • 一套很好的.net控件radcontrols介绍

    一套很好的.net控件radcontrols介绍中文在线阅读器简介:最新的项目有一个是XPS的在线阅读器,这个项目可以说是一个典点的Silverlight商业项目应用,用户可以直接通过一个website查看一个xps文档,这个程序类似目前网站上常见的Flash阅读器,XPS是微软的第的文件格式,是与Adobe的PDF文件格式对立的新格式,而且直接被Office2007(Office12)和WindowsVista支持…

  • android自动化测试框架_GMS测试

    android自动化测试框架_GMS测试GMSP的测试已经开始一段时间了,这里记录一下跟O的不同之处,资料主要来自MTK官网。一、Case数量增加(以Pgo项目为例,64bit项目double)a、CTS测试增加8万条,module增至320b、增加CTS-INSTANT测试项目,module48,1.3万条(13338)、64bit13338,以实际为准;c、VTS测试增加约2…

  • SSDP协议的Python示例「建议收藏」

    SSDP协议的Python示例「建议收藏」废话少说,直接上代码。服务端ssdp_server.py

    2022年10月11日
  • Django(39)使用redis配置缓存[通俗易懂]

    Django(39)使用redis配置缓存[通俗易懂]前言动态网站的基本权衡是,它们是动态的。每次用户请求页面时,Web服务器都会进行各种计算-从数据库查询到模板呈现再到业务逻辑-以创建站点访问者看到的页面。从处理开销的角度来看,这比标准的文件

  • rabbitmq优先级队列_rabbitmq主从模式

    rabbitmq优先级队列_rabbitmq主从模式优先级队列:此队列中的消息可以拥有优先级属性,在发送有优先级属性的消息到此队列时,优先级属性能够生效。优先级高的消息得以提早消费,消息优先级的最大值由队列的属性决定。超出队列的最大值按最大值算。Map<String,Object>priority=newHashMap<String,Object>();priority.put(“x-max-priority…

发表回复

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

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