日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

在java中使用JMH(Java Microbenchmark Harness)做性能测试

發布時間:2024/2/28 java 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 在java中使用JMH(Java Microbenchmark Harness)做性能测试 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

    • 使用JMH做性能測試
    • BenchmarkMode
    • Fork和Warmup
    • State和Scope

在java中使用JMH(Java Microbenchmark Harness)做性能測試

JMH的全稱是Java Microbenchmark Harness,是一個open JDK中用來做性能測試的套件。該套件已經被包含在了JDK 12中。

本文將會講解如何使用JMH來在java中做性能測試。

如果你使用的不是JDK 12,那么需要添加如下依賴:

<dependency><groupId>org.openjdk.jmh</groupId><artifactId>jmh-core</artifactId><version>1.19</version> </dependency> <dependency><groupId>org.openjdk.jmh</groupId><artifactId>jmh-generator-annprocess</artifactId><version>1.19</version> </dependency>

使用JMH做性能測試

如果我們想測試某個方法的性能,一般來說就是重復執行某個方法n次,求出總的執行時間,然后求平均值。

但是這樣通常會有一些問題,比如程序的頭幾次執行通常會比較慢,因為JVM會對多次執行的代碼進行優化。另外得出的統計結果也不夠直觀,需要我們自行解析。

如果使用JMH可以輕松解決這些問題。

在JMH中,將要測試的方法添加@Benchmark注解即可:

@Benchmarkpublic void measureThroughput() throws InterruptedException {TimeUnit.MILLISECONDS.sleep(100);}

看下怎么調用:

public static void main(String[] args) throws RunnerException {Options opt = new OptionsBuilder().include(BenchMarkUsage.class.getSimpleName()) // .include(BenchMarkUsage.class.getSimpleName()+".*measureThroughput*")// 預熱3輪.warmupIterations(3)// 度量5輪.measurementIterations(5).forks(1).build();new Runner(opt).run();}

上面的例子,我們通過OptionsBuilder的include方法添加了需要進行測試的類。

默認情況下,該類的所有@Benchmark方法都將會被測試,如果我們只想測試其中的某個方法,我們可以在類后面加上方法的名字:

.include(BenchMarkUsage.class.getSimpleName()+".*measureAll*")

上面的代碼支持通配符。

warmupIterations(3)意思是在真正的執行前,先熱身三次。

measurementIterations(5)表示我們將方法運行5次來測試性能。

forks(1)表示啟動一個進程來執行這個任務。

上面是最基本的運行,我們看下運行結果:

# JMH version: 1.19 # VM version: JDK 1.8.0_171, VM 25.171-b11 # VM invoker: /Library/Java/JavaVirtualMachines/jdk1.8.0_171.jdk/Contents/Home/jre/bin/java # VM options: -javaagent:/Applications/IntelliJ IDEA 2.app/Contents/lib/idea_rt.jar=55941:/Applications/IntelliJ IDEA 2.app/Contents/bin -Dfile.encoding=UTF-8 # Warmup: 3 iterations, 1 s each # Measurement: 5 iterations, 1 s each # Timeout: 10 min per iteration # Threads: 1 thread, will synchronize iterations # Benchmark mode: Throughput, ops/time # Benchmark: com.flydean.BenchMarkUsage.measureThroughput# Run progress: 26.66% complete, ETA 00:01:42 # Fork: 1 of 1 # Warmup Iteration 1: 9.727 ops/s # Warmup Iteration 2: 9.684 ops/s # Warmup Iteration 3: 9.678 ops/s Iteration 1: 9.652 ops/s Iteration 2: 9.678 ops/s Iteration 3: 9.733 ops/s Iteration 4: 9.651 ops/s Iteration 5: 9.678 ops/sResult "com.flydean.BenchMarkUsage.measureThroughput":9.678 ±(99.9%) 0.129 ops/s [Average](min, avg, max) = (9.651, 9.678, 9.733), stdev = 0.034CI (99.9%): [9.549, 9.808] (assumes normal distribution)

ops/s 是每秒的OPS次數。程序會給出運行的最小值,平均值和最大值。同時給出標準差stdev和置信區間CI。

BenchmarkMode

上面的例子中, 我們只用了最簡單的@Benchmark。如果想實現更加復雜和自定義的BenchMark,我們可以使用@BenchmarkMode。

先舉個例子:

@Benchmark@BenchmarkMode(Mode.Throughput)@OutputTimeUnit(TimeUnit.SECONDS)public void measureThroughput() throws InterruptedException {TimeUnit.MILLISECONDS.sleep(100);}

上面的例子中,我們指定了@BenchmarkMode(Mode.Throughput),Throughput的意思是整體吞吐量,表示給定的時間內執行的次數。

這里我們通過 @OutputTimeUnit(TimeUnit.SECONDS)來指定時間單位。

Mode除了Throughput還有如下幾種模式:

  • AverageTime - 調用的平均時間
  • SampleTime - 隨機取樣,最后輸出取樣結果的分布
  • SingleShotTime - 只會執行一次,通常用來測試冷啟動時候的性能。
  • All - 所有的benchmark modes。

Fork和Warmup

上面的例子中我們通過代碼來顯式的制定Fork和Warmup,我們也可以使用注解來實現:

@Fork(value = 1, warmups = 2)@Warmup(iterations = 5)

上面的例子中value表示該benchMark執行多少次,warmups表示fork多少個進程來執行。iterations表示warmup的iterations個數。

如果你同時在代碼中和注解中都配置了相關的信息,那么注解將會覆蓋掉代碼中的顯示配置。

State和Scope

如果我們在多線程環境中使用beachMark,那么多線程中用到的類變量是共享還是每個線程一個呢?

這個時候我們就要用到@State注解。

@State(Scope.Benchmark) public class StateUsage { }

Scope有三種:

  • Scope.Thread:默認的State,每個測試線程分配一個實例;
  • Scope.Benchmark:所有測試線程共享一個實例,用于測試有狀態實例在多線程共享下的性能;
  • Scope.Group:每個線程組共享一個實例;

本文的例子可以參考https://github.com/ddean2009/learn-java-concurrency/tree/master/benchmark

更多精彩內容且看:

  • 區塊鏈從入門到放棄系列教程-涵蓋密碼學,超級賬本,以太坊,Libra,比特幣等持續更新
  • Spring Boot 2.X系列教程:七天從無到有掌握Spring Boot-持續更新
  • Spring 5.X系列教程:滿足你對Spring5的一切想象-持續更新
  • java程序員從小工到專家成神之路(2020版)-持續更新中,附詳細文章教程

更多教程請參考 flydean的博客

總結

以上是生活随笔為你收集整理的在java中使用JMH(Java Microbenchmark Harness)做性能测试的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。