zoukankan      html  css  js  c++  java
  • JMH

    JMH

    官网:http://openjdk.java.net/projects/code-tools/jmh

    创建JMH测试

    1.注入依赖:

    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
        <properties>
            <project.build.sourceUEncoding>UTF-8</project.build.sourceUEncoding>
            <encoding>UTF-8</encoding>
            <java.version>1.8</java.version>
            <maven.compiler.source>1.8</maven.compiler.source>
            <maven.compiler.target>1.8</maven.compiler.target>
        </properties>
    
        <groupId>org.example</groupId>
        <artifactId>Test_JMH</artifactId>
        <version>1.0-SNAPSHOT</version>
    
    
        <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>
    
    </project>
    

    2.IDEA安装插件 JMH plugin

    file>Settings>Plugins>JMH plugin

    3。注解配置

    compiler->Annotation Procesors->Enable Annotation Procession

    4.定义测试类PS(ParallelStream)

    写了一个类,并行处理流的程序,定义了一个list集合,往这个集合里仍了1000个数。第一个方法是用foreach来判断我们这1000个线程里到底有谁是质数,第二个是使用并行处理流的方法来把集合的数分成若干份 同时判断的。

    package com.gaozhenhua;
    
    import java.util.ArrayList;
    import java.util.List;
    import java.util.Random;
    
    public class PS {
        static List<Integer> nums=new ArrayList<>();
        static {
            Random r=new Random();
            //往集合里面仍了1000个数
            for (int i = 0; i <10000 ; i++) nums.add(1000000+r.nextInt(1000000));
        }
            static void foreach(){
            //使用foreach判断是否是质数  (这里调用的是prime方法)
            nums.forEach(v->isPrime(v));
            }
    
            static void paraller(){
            //使用并行处理流 来判断质数
                //把这个集合的数分成若干份 同时处理
            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。写单元测试(PSTest)

    注意:这个测试类一定要再test package下面

    我们对这个方法进行测试testforeach,很简单我就调用PS这个类的foreach就行了,对他的厕所最关键的是我加了这个注解@Benchmark,这个JMH的注解,是要被JMH解析处理的

    package com.gaozhenhua;
    
    import org.openjdk.jmh.annotations.*;
    
    public class PSTest {
        @Benchmark
            @Warmup(iterations=1,time = 3)//在专业测试里面首先要进行预热,预热次数和预热时间
        @Fork(5)//意思是用多少个线程去执行我们的程序
        @BenchmarkMode(Mode.Throughput)//是对基准测试的一个模式,这个模式用的最多的是Throughput吞吐量
        @Measurement(iterations = 1,time = 3)//这个是整个测试要测试多少遍,调用这个方法要调用多少次
    
        public void testForEach(){
            PS.foreach();
        }
    }
    
    

    6.运行测试类

    运行之后会遇到下面的错误

    这个错误是因为JMH运行需要访问系统的TMP目录 解决方法:

    7.最后 阅读测试报告

    总结 :JMH中的基本概念

    • Warmup:预热,由于JVM中对于特定代码会存在优化(本地化),预热对于测试结果很重要
    • Mesurement:总共执行多少次测试
    • Timeout
    • Threads:线程数,有fork指定
    • Benchmark mode:最基准的模式
    • Benchmark :测试哪一段代码
  • 相关阅读:
    关于前后端跨域问题的解决
    vue+vuex+router+element ui
    winfrom导入excel文件
    winform 导出excel文件
    winfrom DataGridView 列表操作
    LaTex之CTex初体验一
    图像配准的步骤
    Phase Based Feature Detection and Phase Congruency(相位一致性)
    查找论文中的代码
    KullbackLeibler
  • 原文地址:https://www.cnblogs.com/beizhai/p/13796280.html
Copyright © 2011-2022 走看看