基准測試時評估程序/接口性能的一個有效的方法。筆者早期在網上了解到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
運行結果


本篇算是失敗嘗試
下一篇:SpringBoot集成JMH進行基准測試2(正確方法)
其他參考:
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
