SpringBoot集成JMH進行基准測試


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM