当前位置: 首页 > 后端技术 > Java

不要再写main方法测试了,太Low了!这是测试Java的专业方法!

时间:2023-04-01 22:50:33 Java

前言“如果你无法衡量它,你就无法改进它”。在日常开发中,我们有很多选择调用一些代码或者使用工具。当我们不确定他们的表现时,我们首先想到的是Allyouhavetodoismeasureit。很多时候,我们会简单的通过多次计数来衡量,看这个方法的总耗时。但是,如果熟悉JVM的类加载机制,应该知道JVM默认的执行方式是JIT编译和解释混合执行。JVM通过对热点代码的统计分析,识别高频方法调用、循环体、公共模块等。基于JIT动态编译技术,将热点代码转化为机器码,直接送CPU执行。也就是说,JVM会不断编译优化,这就很难确定要重复多少次才能得到稳定的测试结果?所以很多有经验的同学在测试代码之前都会写一个预热逻辑。JMH,全称JavaMicrobenchmarkHarness(微基准测试框架),是一套专门用于Java代码微基准测试的测试工具API,是OpenJDK/Oracle官方发布的一款工具。什么是微基准?简单的说就是方法级别的benchmark,精度可以达到微秒级。对Java进行基准测试时需要注意的几点:测试前热身。防止无用代码进入测试方法。并发测试。给出了测试结果。JMH的使用场景:量化分析一个热点函数的优化效果想量化的知道一个函数执行需要多长时间,以及执行时间和输入变量的相关性比较一个函数的多种实现方式本文主要介绍JMH的DEMO演示,以及常用的注解参数。希望能帮到你。DEMOdemo这里先做一个demo,让不了解JMH的同学也能快速掌握这个工具的大致用法。1.测试工程构建JMH是Java9及以后版本内置的。这是Java8的解释。为了方便,这里直接介绍使用maven搭建JMH测试工程的方式。第一种是使用命令行构建,在指定目录下执行如下命令:$mvnarchetype:generate\-DinteractiveMode=false\-DarchetypeGroupId=org.openjdk.jmh\-DarchetypeArtifactId=jmh-java-benchmark-archetype\-DgroupId=org.sample\-DartifactId=test\-Dversion=1.0相应目录下会出现一个测试工程。打开项目后,我们会看到这样的项目结构。第二种方式是直接在已有的maven工程中添加jmh-core和jmh-generator-annprocess依赖来集成JMH。org.openjdk.jmhjmh-core${jmh.version}org.openjdk.jmhjmh-generator-annprocess${jmh.version}provided2.在这里写性能测试我以通过index和foreach迭代测试LinkedList迭代之间的性能差距为例,编写了一个测试类。涉及到的注解后面会解释,/***@authorRichard_yyf*@version1.02019/8/27*/@State(Scope.Benchmark)@OutputTimeUnit(TimeUnit.SECONDS)@Threads(Threads.MAX)publicclassLinkedListIterationBenchMark{privatestaticfinalintSIZE=10000;私有列表列表=newLinkedList<>();@SetuppublicvoidsetUp(){for(inti=0;i