国产精品久久久aaaa,日日干夜夜操天天插,亚洲乱熟女香蕉一区二区三区少妇,99精品国产高清一区二区三区,国产成人精品一区二区色戒,久久久国产精品成人免费,亚洲精品毛片久久久久,99久久婷婷国产综合精品电影,国产一区二区三区任你鲁

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

JMH的DEMO演示和常用的注解參數

我快閉嘴 ? 來源:稀土掘金技術社區 ? 作者:Richard_Yi ? 2022-09-27 10:49 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

3343897c-3e0b-11ed-9e49-dac502259ad0.jpg

前言

"If you cannot measure it, you cannot improve it".

在日常開發中,我們對一些代碼的調用或者工具的使用會存在多種選擇方式,在不確定他們性能的時候,我們首先想要做的就是去測量它。大多數時候,我們會簡單的采用多次計數的方式來測量,來看這個方法的總耗時。

但是,如果熟悉JVM類加載機制的話,應該知道JVM默認的執行模式是JIT編譯與解釋混合執行。JVM通過熱點代碼統計分析,識別高頻方法的調用、循環體、公共模塊等,基于JIT動態編譯技術,會將熱點代碼轉換成機器碼,直接交給CPU執行。

3356404e-3e0b-11ed-9e49-dac502259ad0.jpg

也就是說,JVM會不斷的進行編譯優化,這就使得很難確定重復多少次才能得到一個穩定的測試結果?所以,很多有經驗的同學會在測試代碼前寫一段預熱的邏輯。

JMH,全稱 Java Microbenchmark Harness (微基準測試框架),是專門用于Java代碼微基準測試的一套測試工具API,是由 OpenJDK/Oracle 官方發布的工具。何謂 Micro Benchmark 呢?簡單地說就是在 method 層面上的 benchmark,精度可以精確到微秒級。

Java的基準測試需要注意的幾個點:

  • 測試前需要預熱。
  • 防止無用代碼進入測試方法中。
  • 并發測試。
  • 測試結果呈現。

JMH的使用場景:

  1. 定量分析某個熱點函數的優化效果
  2. 想定量地知道某個函數需要執行多長時間,以及執行時間和輸入變量的相關性
  3. 對比一個函數的多種實現方式

本篇主要是介紹JMH的DEMO演示,和常用的注解參數。希望能對你起到幫助。

基于 Spring Boot + MyBatis Plus + Vue & Element 實現的后臺管理系統 + 用戶小程序,支持 RBAC 動態權限、多租戶、數據權限、工作流、三方登錄、支付、短信、商城等功能

  • 項目地址:https://gitee.com/zhijiantianya/ruoyi-vue-pro
  • 視頻教程:https://doc.iocoder.cn/video/

DEMO 演示

這里先演示一個DEMO,讓不了解JMH的同學能夠快速掌握這個工具的大概用法。

1. 測試項目構建

JMH是內置Java9及之后的版本。這里是以Java8進行說明。

為了方便,這里直接介紹使用maven構建JMH測試項目的方式。

第一種是使用命令行構建,在指定目錄下執行以下命令:

$mvnarchetype:generate
-DinteractiveMode=false
-DarchetypeGroupId=org.openjdk.jmh
-DarchetypeArtifactId=jmh-java-benchmark-archetype
-DgroupId=org.sample
-DartifactId=test
-Dversion=1.0

對應目錄下會出現一個test項目,打開項目后我們會看到這樣的項目結構。

33670816-3e0b-11ed-9e49-dac502259ad0.jpg

第二種方式就是直接在現有的maven項目中添加jmh-corejmh-generator-annprocess的依賴來集成JMH。

<dependency>
<groupId>org.openjdk.jmhgroupId>
<artifactId>jmh-coreartifactId>
<version>${jmh.version}version>
dependency>
<dependency>
<groupId>org.openjdk.jmhgroupId>
<artifactId>jmh-generator-annprocessartifactId>
<version>${jmh.version}version>
<scope>providedscope>
dependency>

2. 編寫性能測試

這里我以測試LinkedList 通過index 方式迭代和foreach 方式迭代的性能差距為例子,編寫測試類,涉及到的注解在之后會講解。

/**
*@authorRichard_yyf
*@version1.02019/8/27
*/

@State(Scope.Benchmark)
@OutputTimeUnit(TimeUnit.SECONDS)
@Threads(Threads.MAX)
publicclassLinkedListIterationBenchMark{
privatestaticfinalintSIZE=10000;

privateListlist=newLinkedList<>();

@Setup
publicvoidsetUp(){
for(inti=0;i@Benchmark
@BenchmarkMode(Mode.Throughput)
publicvoidforIndexIterate(){
for(inti=0;i"");
}
}

@Benchmark
@BenchmarkMode(Mode.Throughput)
publicvoidforEachIterate(){
for(Strings:list){
System.out.print("");
}
}
}

3. 執行測試

運行 JMH 基準測試有兩種方式,一個是生產jar文件運行,另一個是直接寫main函數或者放在單元測試中執行。

生成jar文件的形式主要是針對一些比較大的測試,可能對機器性能或者真實環境模擬有一些需求,需要將測試方法寫好了放在linux環境執行。

具體命令如下

$mvncleaninstall
$java-jartarget/benchmarks.jar

我們日常中遇到的一般是一些小測試,比如我上面寫的例子,直接在IDE中跑就好了。

啟動方式如下:

publicstaticvoidmain(String[]args)throwsRunnerException{
Optionsopt=newOptionsBuilder()
.include(LinkedListIterationBenchMark.class.getSimpleName())
.forks(1)
.warmupIterations(2)
.measurementIterations(2)
.output("E:/Benchmark.log")
.build();

newRunner(opt).run();
}

4. 報告結果

輸出結果如下,

最后的結果:

BenchmarkModeCntScoreErrorUnits
LinkedListIterationBenchMark.forEachIteratethrpt21192.380ops/s
LinkedListIterationBenchMark.forIndexIteratethrpt2206.866ops/s

整個過程:

>基于SpringCloudAlibaba+Gateway+Nacos+RocketMQ+Vue&Element實現的后臺管理系統+用戶小程序,支持RBAC動態權限、多租戶、數據權限、工作流、三方登錄、支付、短信、商城等功能
>
>*項目地址:
>*視頻教程:

#DetectingactualCPUcount:12detected
#JMHversion:1.21
#VMversion:JDK1.8.0_131,JavaHotSpot(TM)64-BitServerVM,25.131-b11
#VMinvoker:C:ProgramFilesJavajdk1.8.0_131jreinjava.exe
#VMoptions:-javaagentProgramFilesJetBrainsIntelliJIDEA2018.2.2libidea_rt.jar=65175ProgramFilesJetBrainsIntelliJIDEA2018.2.2in-Dfile.encoding=UTF-8
#Warmup:2iterations,10seach
#Measurement:2iterations,10seach
#Timeout:10minperiteration
#Threads:12threads,willsynchronizeiterations
#Benchmarkmode:Throughput,ops/time
#Benchmark:org.sample.jmh.LinkedListIterationBenchMark.forEachIterate

#Runprogress:0.00%complete,ETA0020
#Fork:1of1
#WarmupIteration1:1189.267ops/s
#WarmupIteration2:1197.321ops/s
Iteration1:1193.062ops/s
Iteration2:1191.698ops/s

Result"org.sample.jmh.LinkedListIterationBenchMark.forEachIterate":
1192.380ops/s

#JMHversion:1.21
#VMversion:JDK1.8.0_131,JavaHotSpot(TM)64-BitServerVM,25.131-b11
#VMinvoker:C:ProgramFilesJavajdk1.8.0_131jreinjava.exe
#VMoptions:-javaagentProgramFilesJetBrainsIntelliJIDEA2018.2.2libidea_rt.jar=65175ProgramFilesJetBrainsIntelliJIDEA2018.2.2in-Dfile.encoding=UTF-8
#Warmup:2iterations,10seach
#Measurement:2iterations,10seach
#Timeout:10minperiteration
#Threads:12threads,willsynchronizeiterations
#Benchmarkmode:Throughput,ops/time
#Benchmark:org.sample.jmh.LinkedListIterationBenchMark.forIndexIterate

#Runprogress:50.00%complete,ETA0040
#Fork:1of1
#WarmupIteration1:205.676ops/s
#WarmupIteration2:206.512ops/s
Iteration1:206.542ops/s
Iteration2:207.189ops/s

Result"org.sample.jmh.LinkedListIterationBenchMark.forIndexIterate":
206.866ops/s

#Runcomplete.Totaltime:0021

REMEMBER:Thenumbersbelowarejustdata.Togainreusableinsights,youneedtofollowupon
whythenumbersarethewaytheyare.Useprofilers(see-prof,-lprof),designfactorial
experiments,performbaselineandnegativeteststhatprovideexperimentalcontrol,makesure
thebenchmarkingenvironmentissafeonJVM/OS/HWlevel,askforreviewsfromthedomainexperts.
Donotassumethenumberstellyouwhatyouwantthemtotell.

BenchmarkModeCntScoreErrorUnits
LinkedListIterationBenchMark.forEachIteratethrpt21192.380ops/s
LinkedListIterationBenchMark.forIndexIteratethrpt2206.866ops/s

注解介紹

下面我們來詳細介紹一下相關的注解。

@BenchmarkMode

微基準測試類型。JMH 提供了以下幾種類型進行支持:

類型 描述
Throughput 每段時間執行的次數,一般是秒
AverageTime 平均時間,每次操作的平均耗時
SampleTime 在測試中,隨機進行采樣執行的時間
SingleShotTime 在每次執行中計算耗時
All 所有模式

可以注釋在方法級別,也可以注釋在類級別。

@BenchmarkMode(Mode.All)
publicclassLinkedListIterationBenchMark{
...
}
@Benchmark
@BenchmarkMode({Mode.Throughput,Mode.SingleShotTime})
publicvoidm(){
...
}

@Warmup

這個單詞的意思就是預熱,iterations = 3就是指預熱輪數。

@Benchmark
@BenchmarkMode({Mode.Throughput,Mode.SingleShotTime})
@Warmup(iterations=3)
publicvoidm(){
...
}

@Measurement

正式度量計算的輪數。

  • iterations 進行測試的輪次
  • time 每輪進行的時長
  • timeUnit時長單位
@Benchmark
@BenchmarkMode({Mode.Throughput,Mode.SingleShotTime})
@Measurement(iterations=3)
publicvoidm(){
...
}

@Threads

每個進程中的測試線程。

@Threads(Threads.MAX)
publicclassLinkedListIterationBenchMark{
...
}

@Fork

進行 fork 的次數。如果 fork 數是3的話,則 JMH 會 fork 出3個進程來進行測試。

@Benchmark
@BenchmarkMode({Mode.Throughput,Mode.SingleShotTime})
@Fork(value=3)
publicvoidm(){
...
}

@OutputTimeUnit

基準測試結果的時間類型。一般選擇秒、毫秒、微秒。

@OutputTimeUnit(TimeUnit.SECONDS)
publicclassLinkedListIterationBenchMark{
...
}

@Benchmark

方法級注解,表示該方法是需要進行 benchmark 的對象,用法和 JUnit 的 @Test 類似。

@Param

屬性級注解,@Param 可以用來指定某項參數的多種情況。特別適合用來測試一個函數在不同的參數輸入的情況下的性能。

@Setup

方法級注解,這個注解的作用就是我們需要在測試之前進行一些準備工作 ,比如對一些數據的初始化之類的。

@TearDown

方法級注解,這個注解的作用就是我們需要在測試之后進行一些結束工作 ,比如關閉線程池,數據庫連接等的,主要用于資源的回收等。

@State

當使用@Setup參數的時候,必須在類上加這個參數,不然會提示無法運行。

就比如我上面的例子中,就必須設置state

State 用于聲明某個類是一個“狀態”,然后接受一個 Scope 參數用來表示該狀態的共享范圍。因為很多 benchmark 會需要一些表示狀態的類,JMH 允許你把這些類以依賴注入的方式注入到 benchmark 函數里。Scope 主要分為三種。

  1. Thread: 該狀態為每個線程獨享。
  2. Group: 該狀態為同一個組里面所有線程共享。
  3. Benchmark: 該狀態在所有線程間共享。

啟動方法

在啟動方法中,可以直接指定上述說到的一些參數,并且能將測試結果輸出到指定文件中,

/**
*僅限于IDE中運行
*命令行模式則是build然后java-jar啟動
*
*1.這是benchmark啟動的入口
*2.這里同時還完成了JMH測試的一些配置工作
*3.默認場景下,JMH會去找尋標注了@Benchmark的方法,可以通過include和exclude兩個方法來完成包含以及排除的語義
*/
publicstaticvoidmain(String[]args)throwsRunnerException{
Optionsopt=newOptionsBuilder()
//包含語義
//可以用方法名,也可以用XXX.class.getSimpleName()
.include("Helloworld")
//排除語義
.exclude("Pref")
//預熱10輪
.warmupIterations(10)
//代表正式計量測試做10輪,
//而每次都是先執行完預熱再執行正式計量,
//內容都是調用標注了@Benchmark的代碼。
.measurementIterations(10)
//forks(3)指的是做3輪測試,
//因為一次測試無法有效的代表結果,
//所以通過3輪測試較為全面的測試,
//而每一輪都是先預熱,再正式計量。
.forks(3)
.output("E:/Benchmark.log")
.build();

newRunner(opt).run();
}

結語

基于JMH可以對很多工具和框架進行測試,比如日志框架性能對比、BeanCopy性能對比 等,更多的example可以參考官方給出的JMH samples(https://hg.openjdk.java.net/code-tools/jmh/file/tip/jmh-samples/src/main/java/org/openjdk/jmh/samples/)



審核編輯:湯梓紅


聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • JAVA
    +關注

    關注

    20

    文章

    3001

    瀏覽量

    116434
  • JVM
    JVM
    +關注

    關注

    0

    文章

    161

    瀏覽量

    13037

原文標題:別再寫 main 方法測試了,太 Low!這才是專業 Java 測試方法!

文章出處:【微信號:芋道源碼,微信公眾號:芋道源碼】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    如何通過注解來優化我們的Java代碼

    Java注解可以說是我們編碼過程中最常用的。本篇文章將給大家介紹Java注解的概念、作用以及如何使用注解來提升代碼的可讀性和靈活性,并介紹如何通過
    的頭像 發表于 09-30 11:39 ?1378次閱讀

    【HarmonyOS IPC 試用連載 】開箱+DEMO演示

    釘,然后再裝。 注意:鏍釘先別扭緊,調好焦后再扭緊。組裝搞定,可以開始搞機了!3.demo演示 1)出廠程序DEMO演示依據說明文檔。掃描二維碼下載手機APP。安裝APP(P6SLit
    發表于 10-23 00:40

    HarmonyOS注解的使用方法分享

    ; }}運行項目報錯:缺少get方法! 類名:com.example.annotation.demo.Person 參數名:age
    發表于 03-28 14:04

    PWM_Demo:F280x PWM 功能演示應用程序

    PWM_Demo:F280x PWM 功能演示應用程序
    發表于 04-10 14:33 ?8次下載

    基于TX4101制作的DEMO演示

    基本描述: 本 DEMO 為 TX4101 制作的演示板,用于 DC 輸入4.2-5.0V,輸出電壓 3.3V,輸出電流 600mA 的應用演示,最高轉換效率高達 93%。 本電路固定工作頻率是:1MHz。輸出 3.3V/600
    發表于 05-07 14:58 ?886次閱讀
    基于TX4101制作的<b class='flag-5'>DEMO</b><b class='flag-5'>演示</b>板

    基于TX4205制作的DEMO演示

    DEMO 為 TX4205 制作的演示板,用于 DC 輸入 3.6-5.0V,輸出恒壓12V,輸出電流 1A 的應用演示,最高轉換效率高達 87%。
    發表于 05-11 11:10 ?984次閱讀
    基于TX4205制作的<b class='flag-5'>DEMO</b><b class='flag-5'>演示</b>板

    基于TX6410制作的DEMO演示

    DEMO 為 TX6410 制作的演示板,用于 DC 輸入 12-24V,多種電壓輸出, 輸出電流 350mA 的應用演示,最高轉換效率高達 88%。 本電路實現了線性降壓恒流功能
    的頭像 發表于 05-11 11:36 ?2217次閱讀
    基于TX6410制作的<b class='flag-5'>DEMO</b><b class='flag-5'>演示</b>板

    Spring Boot常用注解與使用方式

    企業開發項目SpringBoot已經是必備框架了,其中注解是開發中的小工具(誰處可見哦),用好了開發效率大大提升,當然用錯了也會引入缺陷。
    的頭像 發表于 07-08 10:57 ?2131次閱讀

    SpringBoot常用注解及使用方法1

    基于 SpringBoot 平臺開發的項目數不勝數,與常規的基于`Spring`開發的項目最大的不同之處,SpringBoot 里面提供了大量的注解用于快速開發,而且非常簡單,基本可以做到開箱即用! 那 SpringBoot 為開發者提供了多少注解呢?我們該如何使用
    的頭像 發表于 04-07 11:51 ?1263次閱讀

    SpringBoot常用注解及使用方法2

    基于 SpringBoot 平臺開發的項目數不勝數,與常規的基于Spring開發的項目最大的不同之處,SpringBoot 里面提供了大量的注解用于快速開發,而且非常簡單,基本可以做到開箱即用!
    的頭像 發表于 04-07 11:52 ?1269次閱讀

    Springboot常用注解合集

    前幾章,在系統啟動類里面,都加入了此啟動注解,此注解是個組合注解,包括了`@SpringBootConfiguration`、`@EnableAutoConfiguration`和`@ComponentScan`
    的頭像 發表于 04-07 14:27 ?1307次閱讀
    Springboot<b class='flag-5'>常用</b><b class='flag-5'>注解</b>合集

    SpringBoot常用注解及原理

    SpringBootConfiguration繼承自@Configuration,二者功能也一致,標注當前類是配置類, 并會將當前類內聲明的一個或多個以@Bean注解標記的方法的實例納入到spring容器中,并且實例名就是方法名。
    的頭像 發表于 04-07 14:30 ?982次閱讀

    JAVA中注解是怎么做到的(上)

    注解想必大家在項目中經常使用,比如Spring框架中常用的一些注解:`@Controller`、`@Service`、`@RequestMapping`等等,它是JDK1.5及以后版本引入的一個特性
    的頭像 發表于 05-11 10:57 ?1167次閱讀

    JAVA中注解是怎么做到的(下)

    注解想必大家在項目中經常使用,比如Spring框架中常用的一些注解:`@Controller`、`@Service`、`@RequestMapping`等等,它是JDK1.5及以后版本引入的一個特性
    的頭像 發表于 05-11 10:57 ?1044次閱讀
    JAVA中<b class='flag-5'>注解</b>是怎么做到的(下)

    springmvc常用5種注解

    SpringMVC是一種基于Java的Web框架,使用注解可以更加方便靈活地開發和管理控制器,實現請求的映射和處理。在SpringMVC中,有許多常用注解,本文將詳細介紹其中的五種注解
    的頭像 發表于 11-22 16:51 ?1683次閱讀