開心生活站

位置:首頁 > IT科技 > 

java,jmh

IT科技1.13W

<link rel="stylesheet" href="https://js.how234.com/third-party/SyntaxHighlighter/shCoreDefault.css" type="text/css" /><script type="text/javascript" src="https://js.how234.com/third-party/SyntaxHighlighter/shCore.js"></script><script type="text/javascript"> SyntaxHighlighter.all(); </script>

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配置預熱參數。

java jmh

爲了數據準確,我們可能需要讓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();}

標籤:jmh java