一、背景
在benchmark的世界里頭,分為廣義的benchmark和狹義的benchmark(即microbenchmark,中文人稱微基準(zhǔn)測(cè)試)焊切。
廣義的benchmark涵蓋很多方面,對(duì)于一個(gè)分層的web系統(tǒng)來說芳室,可能包括操作系統(tǒng)的专肪、數(shù)據(jù)庫(kù)的、網(wǎng)絡(luò)交互的堪侯、應(yīng)用系統(tǒng)里頭的benchmark嚎尤;microbenchmark是針對(duì)一個(gè)相對(duì)的小的方面來說的,比如針對(duì)java系統(tǒng)的microbenchmark抖格,針對(duì)數(shù)據(jù)庫(kù)負(fù)載能力的microbenchmark诺苹,針對(duì)web服務(wù)器的microbenchmark等等咕晋。
而在java里頭的microbenchmark又牽涉到許多java編譯優(yōu)化方面的benchmark處理雹拄,比如針對(duì)普通java應(yīng)用系統(tǒng)的性能測(cè)試,需要預(yù)熱階段掌呜,是的JIT的優(yōu)化能達(dá)到效果滓玖,系統(tǒng)進(jìn)入穩(wěn)定狀態(tài),盡量控制變量质蕉,好得出實(shí)驗(yàn)結(jié)果势篡。當(dāng)然,如果本身就是要測(cè)試jvm編譯優(yōu)化的模暗,那就可以省去這步了禁悠。
因而,如何知道系統(tǒng)什么時(shí)候進(jìn)入穩(wěn)定狀態(tài)兑宇,JIT的優(yōu)化不會(huì)對(duì)實(shí)現(xiàn)結(jié)果造成不必要的干擾碍侦,就得程序去處理預(yù)熱階段,可能比較復(fù)雜隶糕,不過還好瓷产,有人搞了一個(gè)JMH的code tool,是的在java里頭進(jìn)行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)命令行運(yùn)行
mvn clean install
java -jar target/benchmarks.jar JMHSample_01`
(4)main方法里頭運(yùn)行
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();
}
三尔邓、參數(shù)說明
1晾剖、Mode.Throughput
在有時(shí)限的迭代里頭,該方法能被調(diào)用多少次
2梯嗽、Mode.AverageTime
方法平均執(zhí)行時(shí)間
3钞瀑、Mode.SampleTime
對(duì)方法執(zhí)行時(shí)間進(jìn)行采樣計(jì)算
4、Mode.SingleShotTime
方法的單次調(diào)用時(shí)間/一次批處理的總調(diào)用時(shí)間
注意點(diǎn):
從@State對(duì)象讀取測(cè)試輸入并返回計(jì)算的結(jié)果慷荔,方便JMH對(duì)冗余代碼進(jìn)行消除雕什;
如果是測(cè)試方法的性能,則避免通過在方法內(nèi)循環(huán)(重復(fù)執(zhí)行方法內(nèi)原來代碼)显晶,這樣造成方法方法調(diào)用次數(shù)的減少贷岸,結(jié)果不準(zhǔn)確,應(yīng)該把循環(huán)調(diào)用放在方法外頭磷雇。
examples的話偿警,參考官網(wǎng):
http://hg.openjdk.java.net/code-tools/jmh/file/tip/jmh-samples/src/main/java/org/openjdk/jmh/samples/