一、背景
在benchmark的世界里頭,分為廣義的benchmark和狹義的benchmark(即microbenchmark,中文人稱微基準測試)。
廣義的benchmark涵蓋很多方面,對于一個分層的web系統來說,可能包括操作系統的、數據庫的、網絡交互的、應用系統里頭的benchmark;microbenchmark是針對一個相對的小的方面來說的,比如針對java系統的microbenchmark,針對數據庫負載能力的microbenchmark,針對web服務器的microbenchmark等等。
而在java里頭的microbenchmark又牽涉到許多java編譯優化方面的benchmark處理,比如針對普通java應用系統的性能測試,需要預熱階段,是的JIT的優化能達到效果,系統進入穩定狀態,盡量控制變量,好得出實驗結果。當然,如果本身就是要測試jvm編譯優化的,那就可以省去這步了。
因而,如何知道系統什么時候進入穩定狀態,JIT的優化不會對實現結果造成不必要的干擾,就得程序去處理預熱階段,可能比較復雜,不過還好,有人搞了一個JMH的code tool,是的在java里頭進行microbenchmark變得異常方便。
二、工具
1、jmh
JMH (Java Micro-benchmarks Harness or Juicy Munchy Hummus, hard to say as they don't tell you on the site) is the latest and as it comes out of the workshop of the very people who work hard to make the OpenJDK JVM fly it promises to deliver more accuracy and better tooling then most.
2、使用方式
(1)基于maven的配置
<dependency>
<groupId>org.openjdk.jmh</groupId>
<artifactId>jmh-core</artifactId>
<version>0.4.2</version>
</dependency>
(2)HELLO WORLD
public class JMHSample_01_HelloWorld {
@GenerateMicroBenchmark
public void wellHelloThere() {
// this method was intentionally left blank.
}
}
(3)命令行運行
mvn clean install
java -jar target/benchmarks.jar JMHSample_01`
(4)main方法里頭運行
public static void main(String[] args) throws RunnerException {
Options opt = new OptionsBuilder()
.include(JMHSample_01_HelloWorld.class.getSimpleName())
.forks(1)
.build();
new Runner(opt).run();
}
三、參數說明
1、Mode.Throughput
在有時限的迭代里頭,該方法能被調用多少次
2、Mode.AverageTime
方法平均執行時間
3、Mode.SampleTime
對方法執行時間進行采樣計算
4、Mode.SingleShotTime
方法的單次調用時間/一次批處理的總調用時間
注意點:
從@State對象讀取測試輸入并返回計算的結果,方便JMH對冗余代碼進行消除;
如果是測試方法的性能,則避免通過在方法內循環(重復執行方法內原來代碼),這樣造成方法方法調用次數的減少,結果不準確,應該把循環調用放在方法外頭。
examples的話,參考官網:
http://hg.openjdk.java.net/code-tools/jmh/file/tip/jmh-samples/src/main/java/org/openjdk/jmh/samples/