java jmh是什么,讓我們一起了解一下?
JMH是一種Java工具,用于構建、運行和分析用Java和其他針對JVM的語言編寫的nano/micro/mili/macro基準測試。JMH一般用于代碼的性能調優,精度可以達到納秒級別,適用于 java以及其他基于JVM的語言。
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,那么每次測量都會創建兩個線程來執行基準測試方法。
具體代碼如下:
public?void?lockInc(){ ????????lock.lock(); ????????try?{ ????????????x++; ????????}finally?{ ????????????lock.unlock(); ????????} ????} ??public??void?synInt(){ ??????synchronized?(this){ ??????????x++; ??????} ??} } @State(Scope.Group) public?static?class?InterMoticMonitor{ ????private?AtomicInteger?a=new?AtomicInteger(); ????public?void?atoMic(){ ????????a.incrementAndGet(); ????} } @Benchmark @Group("sync") @GroupThreads(10) public?void?syn(IntMonitor?intMonitor){ ????intMonitor.synInt(); } @Benchmark @Group("lock") @GroupThreads(10) public?void?lock(IntMonitor?intMonitor){ ????intMonitor.lockInc(); } @Benchmark @Group("Atomic") @GroupThreads(10) public?void?atominDemo(InterMoticMonitor?interMoticMonitor){ ????interMoticMonitor.atoMic(); } public?static?void?main(String[]?args)?throws?RunnerException?{ ????final?Options?opts=new?OptionsBuilder() ????????????.include(Explamlee01.class.getSimpleName()) ????????????.forks(1) ????????????.warmupIterations(10) ????????????.measurementIterations(10) ????????????.build(); ????new?Runner(opts).run(); }
以上就是小編今天的分享了,希望可以幫助到大家。