java准测试套件—JMH实战入门

这篇具有很好参考价值的文章主要介绍了java准测试套件—JMH实战入门。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

JMH实战入门

引言

在多线程中有这样一个思想,就是尽可能的压榨cpu,这里就提到了效率。那么怎么知道一个程序的效率呢,JMH(java Microbenchmark Harness),就是专门测量方法性能好不好的一个工具。有时我们想测试自己写的代码的性能,就不用自己写测试代码,而可以直接用它了。本篇就对其做一个简单的介绍。

JMH使用步骤

这里会做一个小实验,测算不同方法的吞吐量,也是对JMH做一个简单的入门。

  1. 创建Maven项目,添加两个依赖:

    1.1:jmh-core (jmh的核心)

    1.2:jmh-generator-annprocess(注解处理包)

       <dependencies>
            <!-- https://mvnrepository.com/artifact/org.openjdk.jmh/jmh-core -->
            <dependency>
                <groupId>org.openjdk.jmh</groupId>
                <artifactId>jmh-core</artifactId>
                <version>1.21</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.21</version>
                <scope>test</scope>
            </dependency>
        </dependencies>
    
  2. idea安装JMH插件

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nfWXJ9r5-1651679078535)(C:\Users\27901\AppData\Roaming\Typora\typora-user-images\image-20220502123707707.png)]

  3. 由于用到了注解,打开运行程序注解配置

    compiler -> Annotation Processors -> Enable Annotation Processing

  4. 定义需要测试类PS (ParallelStream)

    在这个类中,并行处理流的一个程序,定义了一个list集合,然后往这个集合里扔了1000个数。写了一个方法来判断这个数到底是不是一个质数。写了两个方法,第一个是用forEach来判断我们这1000个数里到底有谁是质数;第二个是使用了并行处理流,这个forEach的方法就只有单线程里面执行,挨着从头拿到尾,从0拿到1000,但是并行处理的时候会有多个线程采用ForkJoin的方式来把里面的数分成好几份并行的尽兴处理。一种是串行处理,一种是并行处理,对这两个方法进行性能测试。

    public class PS {
    
    	static List<Integer> nums = new ArrayList<>();
    	static {
    		Random r = new Random();
    		for (int i = 0; i < 10000; i++) nums.add(1000000 + r.nextInt(1000000));
    	}
    
    	static void foreach() {
    		nums.forEach(v->isPrime(v));
    	}
    
    	static void parallel() {
    		nums.parallelStream().forEach(PS::isPrime);
    	}
    	
    	static boolean isPrime(int num) {
    		for(int i=2; i<=num/2; i++) {
    			if(num % i == 0) return false;
    		}
    		return true;
    	}
    }
    
  5. 写单元测试

    这个测试类一定要在test package下面

    我对这个方法进行测试testForEach,很简单我就调用PS这个类的foreach就行了,对它测试最关键的是我加了这个注解@Benchmark,这个是JMH的注解,是要被JMH来解析处理的,这也是我们为么要把那个Annotation Processing给设置上的原因,非常简单,你只要加上注解就可以对这个方法进行微基准测试了,点击右键直接run。

    public class PSTest {
     @Benchmark
     @Fork(5)//意思是用多少个线程去执行我们的程序
     @BenchmarkMode(Mode.Throughput)//是对基准测试的一个模式,这个模式用的最多的是Throughput吞吐量
     @Measurement(iterations=1, time=3)//是整个测试要测试多少遍,调用这个方法要调用多少次
     public void testForEach() {
    //        PS.foreach();
         PS.parallel();
     }
    }
    
  6. Run配置,运行访问环境变量。

    RunConfiguration -> Environment Variables -> include system environment viables

  7. 测试结果

    foreach方法,可以看到其每秒能执行0.768 ± 0.010次

    Benchmark            Mode  Cnt  Score   Error  Units
    PSTest.testForEach  thrpt   25  0.768 ± 0.010  ops/s
    

    parallel方法,可以看到其每秒能执行5.885 ± 1.483次

    Benchmark            Mode  Cnt  Score   Error  Units
    PSTest.testForEach  thrpt    5  5.885 ± 1.483  ops/s
    

JMH中的基本概念

  1. Warmup
    预热,由于JVM中对于特定代码会存在优化(本地化),预热对于测试结果很重要
  2. Mesurement
    总共执行多少次测试
  3. Threads
    线程数,由fork指定
  4. Benchmark mode
    基准测试的模式
  5. Benchmark
    测试哪一段代码

说在最后

本文是用JMH对一个方法的吞吐量进行了性能测试,作为JMH的入门例子。实际JMH还有很多用法,进一步探索可以去看官方的例子。

官方样例:
http://hg.openjdk.java.net/code-tools/jmh/file/tip/jmh-samples/src/main/java/org/openjdk/jmh/samples/文章来源地址https://www.toymoban.com/news/detail-401901.html

到了这里,关于java准测试套件—JMH实战入门的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 测试工具之JMH详解

    在日常开发中,我们对一些代码的调用或者工具的使用会存在多种选择方式,在不确定他们性能的时候,我们首先想要做的就是去测量它。大多数时候,我们会简单的采用多次计数的方式来测量,来看这个方法的总耗时。 但是,如果熟悉 JVM 类加载机制的话,应该知道 JVM 默

    2024年02月08日
    浏览(46)
  • 【精通性能优化:解锁JMH微基准测试】一基本用法

    1. 什么是JMH JMH是Java Micro Benchmark Harness的简写,是专门用于代码微基准测试的工具集。 JMH由实现Java虚拟你的团队开发,现代JVM已经变的越来越智能,在Java文件的编译阶段、类的加载阶段,以及运行阶段都可能进行了不同程度的优化,因此开发者编写的代码未必会像自己所预

    2024年02月12日
    浏览(39)
  • 性能调优之JMH必知必会3:编写正确的微基准测试用例

      性能调优之JMH必知必会1:什么是JMH 性能调优之JMH必知必会2:JMH的基本用法 性能调优之JMH必知必会4:JMH的高级用法 性能调优之JMH必知必会5:JMH的Profiler       在前面两篇文章中分别介绍了什么是JMH、JMH的基本法。现在来介绍JMH正确的微基准测试用例如何编写。【 单位

    2023年04月08日
    浏览(46)
  • Rust 基础入门 ——所有权 引言 :垃圾自动回收机制的缺陷。

    在以往,内存安全几乎都是通过 GC 的方式实现,但是 GC 会引来性能、内存占用以及 Stop the world 等问题,在高性能场景和系统编程上是不可接受的, 我们先介绍一下这些概念都是什么: 内存安全 是指程序在运行过程中不会访问未分配的内存或者已释放的内存,从而避免了内

    2024年02月11日
    浏览(38)
  • Python多线程编程深度探索:从入门到实战

    title: Python多线程编程深度探索:从入门到实战 date: 2024/4/28 18:57:17 updated: 2024/4/28 18:57:17 categories: 后端开发 tags: 多线程 并发编程 线程安全 Python 异步IO 性能优化 实战项目 Python是一种高级、通用、解释型的编程语言,由Guido van Rossum于1991年创建。Python以其简洁、易读的语法而闻

    2024年04月28日
    浏览(46)
  • Java Web 实战 10 - 多线程基础之线程池

    大家好 , 这篇文章给大家带来的是多线程当中的线程池 , 使用线程池可以降低资源消耗 , 通过重复利用已创建的线程降低线程创建和销毁造成的消耗 . 还可以提高响应速度 , 当任务到达时,任务可以不需要等到线程创建就能立即执行 我们会从三个角度分析线程池 线程池是什

    2023年04月08日
    浏览(40)
  • PyCharm运行python测试,报错“没有发现测试”/“空套件”

    问题描述:没有发现测试/空套件                       当时没截图,可惜了! 把python测试文件的文件名改为非test开头的! (虽然pytest的官方说要以test开头,但是他这样会有错误,就很离谱!!!)    改后大概率可以了!   不行的话,可以清除缓存 或者切换到另一个

    2024年02月07日
    浏览(47)
  • 接口自动化测试套件封装示例

     在Python中,我们可以使用requests库来实现接口自动化测试,并使用unittest或pytest等测试框架来组织和运行测试套件。以下是一个基本的接口自动化测试套件封装示例: 首先,我们需要安装所需的库: 创建一个项目目录结构,如下所示: 同时,在这我也准备了一份软件测试视

    2024年02月03日
    浏览(39)
  • 全网最强,Python+Appium+pytest自动化测试,多设备并发+多线程(实战详细)

    Appium+python 实现单设备的 app 自动化测试 启动 appium server,占用端口 4723; 电脑与一个设备连接,通过 adb devices 获取已连接的设备; 在 python 代码当中,编写启动参数,通过 pytest 编写测试用例,来进行自动化测试。 若要多设备并发,同时执行自动化测试 需要: 确定设备个数

    2024年02月02日
    浏览(49)
  • Java入门12(多线程)

    继承 Thread 类:一旦继承了 Thread 类,就不能再继承其他类了,可拓展性差 实现 Runnable 接口:仍然可以继承其他类,可拓展性较好 使用线程池 继承Thread 类 ​不能通过线程对象调用 run() 方法,需要通过 t1.start() 方法,使线程进入到就绪状态,只要进入到就绪状态的线程才有

    2024年02月13日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包