基准测试时评估程序/接口性能的一个有效的方法。笔者早期在网上了解到JMH这个代码工具。由于之前找到的一些代码不具备项目
实践场景的说服力,通常是一项简单算法,独立小功能模块性的代码,便没有深入了解。
网址:https://openjdk.java.net/projects/code-tools/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 为目标的纳米/微秒/毫秒/宏(黑人问号marco这里应该翻译成宏吗) 级基准框架。
笔者今晨忽然想起他和Springboot集合进行基准测试,于是找到了以下一篇文章。
Springboot整合JMH基准测试
转载地址:https://blog.csdn.net/peng_0129/article/details/100134320
直接上代码
pom.xml
<dependency> <groupId>org.openjdk.jmh</groupId> <artifactId>jmh-core</artifactId> <version>1.21</version> <scope>test</scope> </dependency> <!--<dependency>--> <!--<groupId>org.openjdk.jmh</groupId>--> <!--<artifactId>jmh-generator-annprocess</artifactId>--> <!--<version>1.20</version>--> <!--<scope>provided</scope>--> <!--</dependency>-->
JMHSpringBootTest.java
import com.xxx.service.DataService; import org.openjdk.jmh.annotations.*; import org.openjdk.jmh.runner.Runner; import org.openjdk.jmh.runner.RunnerException; import org.openjdk.jmh.runner.options.Options; import org.openjdk.jmh.runner.options.OptionsBuilder; import org.springframework.boot.SpringApplication; import org.springframework.context.ConfigurableApplicationContext; //https://blog.csdn.net/peng_0129/article/details/100134320 //@BenchmarkMode(Mode.AverageTime) // 测试方法平均执行时间 //@OutputTimeUnit(TimeUnit.MICROSECONDS) // 输出结果的时间粒度为微秒 @State(Scope.Thread) public class JMHSpringBootTest { private ConfigurableApplicationContext context; private DataService dataService; public static void main(String[] args) throws RunnerException { Options options = new OptionsBuilder().include(JMHSpringBootTest.class.getName()+".*") .warmupIterations(2).measurementIterations(2).forks(1).build(); new Runner(options).run(); } /** * setup初始化容器的时候只执行一次 */ @Setup(Level.Trial) public void init(){ context = SpringApplication.run(Main.class); dataService = context.getBean(DataService.class); } /** * benchmark执行多次,此注解代表触发我们所要进行基准测试的方法 */ @Benchmark public void test(){ System.out.println(dataService.getDataNode()); } }
切忌,一定在要控制台使用maven运行,不能单独使用java类,运行报错
Exception in thread "main" java.lang.RuntimeException: ERROR: Unable to find the resource: /META-INF/BenchmarkList
at org.openjdk.jmh.runner.AbstractResourceReader.getReaders(AbstractResourceReader.java:98)
at org.openjdk.jmh.runner.BenchmarkList.find(BenchmarkList.java:122)
at org.openjdk.jmh.runner.Runner.internalRun(Runner.java:263)
at org.openjdk.jmh.runner.Runner.run(Runner.java:209)
at com.netmarch.covid19.JMHSpringBootTest.main(JMHSpringBootTest.java:21)
以及以下错误:
Error:java: 服务配置文件不正确, 或构造处理程序对象javax.annotation.processing.Processor: Provider org.openjdk.jmh.generators.BenchmarkProcessor could not be instantiated:
java.lang.NoClassDefFoundError: org/openjdk/jmh/generators/core/GeneratorSource时抛出异常错误
在terminal输入
mvn clean install
运行结果
其他参考:
https://blog.csdn.net/kevin_mails/article/details/88943881
https://blog.csdn.net/wangyadong317/article/details/83215285
https://stackoverflow.com/questions/38056899/jmh-unable-to-find-the-resource-meta-inf-benchmarklist
来源:https://www.cnblogs.com/passedbylove/p/12365369.html