Java基准测试工具JMH详解(java注释@)
1.JMH概述
1.1 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的語言編寫的nano/micro/mili/macro基準測試。
JMH 是 OpenJDK 團隊開發的一款基準測試工具,一般用于代碼的性能調優,精度甚至可以達到納秒級別,適用于 java 以及其他基于 JVM 的語言。和 Apache JMeter 不同,JMH 測試的對象可以是任一方法,顆粒度更小,而不僅限于rest api。
官方地址:http://openjdk.java.net/projects/code-tools/jmh/
官網案例:http://hg.openjdk.java.net/code-tools/jmh/file/tip/jmh-samples/src/main/java/org/openjdk/jmh/samples/
1.2 JMH與JMeter區別
JMeter更多是對rest api接口進行壓測,可以通過設置參數編寫腳本實現模擬并發場景進行單模塊或者是整個鏈路進行壓測。
而JMH關注的是某一段代碼或者是某個方法在jvm中執行的效率,顆粒度更細,可以使用 JMH 對優化的效果進行定量的分析。
1.3 JMH注解說明
在運行時,注解配置被用于解析生成BenchmarkListEntry配置類實例。
一個方法對應一個@Benchmark注解,一個@Benchmark注解對應一個基準測試方法。
注釋在類上的注解,或者注釋在類的字段上的注解,則是類中所有基準測試方法共用的配置。
@Benchmark聲明一個public方法為基準測試方法。
@BenchmarkMode通過JMH我們可以輕松的測試出某個接口的吞吐量、平均執行時間等指標的數據(假設我想測試testGson方法的平均耗時,那么可以使用@BenchmarkMode注解指定測試維度為Mode.AverageTime。)
@Measurement測量次數
@Measurement假設我想測量testGson方法五次,那么可以使用@Measurement注解。
@Warmup配置預熱參數。
為了數據準確,我們可能需要讓testGson方法做下熱身運動。如在方法中創建GsonParser對象,預熱可以避免首次創建GsonParser時因多了類加載的耗時而導致測試結果不準備的情況。jvm使用JIT即時編譯器,一定的預熱次數可讓JIT對testGson方法的調用鏈路完成編譯,去掉解釋執行對測試結果的影響。
@OutputTimeUnit
OutputTimeUnit注解用于指定輸出的方法執行耗時的單位。如果方法執行耗時為秒級別,為了便于 觀察結果,我們可以使用@OutputTimeUnit指定輸出的耗時時間單位為秒;如果方法執行耗時為毫秒級別,為了便于觀察結果,我們可以使用@OutputTimeUnit指定輸出的耗時時間單位為毫秒,否則使用默認的秒做單位,會輸出10的負幾次方這樣的數字,不太直觀。
@Fork用于指定fork出多少個子進程來執行同一基準測試方法。假設我們不需要多個進程,那么 可以使用@Fork指定為進程數為1。
@Threads注解用于指定使用多少個線程來執行基準測試方法,如果使用@Threads指定線程數為2,那么每次測量都會創建兩個線程來執行基準測試方法。
2.JMH驗證
2.1 創建項目
創建一個基準測試項目,基本的Maven項目引入jmh依賴,jmh包括兩部分jmh-core與jmh-generator-annprocess。
2.2 引入依賴
<!--JMH-->
<!-- https://mvnrepository.com/artifact/org.openjdk.jmh/jmh-core -->
<dependency>
<groupId>org.openjdk.jmh</groupId>
<artifactId>jmh-core</artifactId>
<version>1.33</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.33</version>
<scope>provided</scope>
</dependency>
2.3 啟動異常解決
關于JMH運行ERROR: transport error 202: connect failed: Connection refused ERROR解決。
網上有很多說法,又是插件引入,又是idea配置,實際上你應該是啟動的debug模式,換成run模式就行。
2.4 JMH案例
/** * JMH案例1 * * @author zrj * @since 2021/10/9 **/
public class JMHSample_01_HelloWorld {
@Benchmark
@BenchmarkMode(Mode.Throughput)
@Warmup(iterations = 3)
@Measurement(iterations = 3, time = 5, timeUnit = TimeUnit.SECONDS)
@Threads(1)
@Fork(1)
@OutputTimeUnit(TimeUnit.SECONDS)
public void wellHelloThere() throws InterruptedException {
Thread.sleep( 1000 );
}
/** * JMH的基礎配置 * include:benchmark所在類的名字,可以使用正則表達 * warmupIteration:預熱的迭代次數,這里為什么要預熱的原因是由于JIT的存在,隨著代碼的運行,會動態對代碼的運行進行優化。因此在測試過程中需要先預熱幾輪,讓代碼運行穩定后再實際進行測試 * measurementIterations:實際測試輪次 * output:測試報告輸出位置,不配置則輸出到控制臺。 */
public static void main(String[] args) throws RunnerException {
Options opt = new OptionsBuilder()
.include( JMHSample_01_HelloWorld.class.getSimpleName() )
.forks( 1 )
.build();
new Runner( opt ).run();
}
}
總結
以上是生活随笔為你收集整理的Java基准测试工具JMH详解(java注释@)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 为了避免做“无用的SEO工作”,下面几种
- 下一篇: 不得不知的做好电子商务运营的七部曲!点进