開心生活站

位置:首頁 > 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();}

標籤:java jmh