使用JMH框架進(jìn)行性能基準(zhǔn)測(cè)試

介紹

我們?cè)谶x擇不同框架草慧、算法時(shí),不同場(chǎng)景下的性能是很重要考慮因素洽议。JMH這個(gè)Java的微基準(zhǔn)測(cè)試框架提供簡(jiǎn)單的方式來實(shí)現(xiàn)性能測(cè)試的需求。本文將以一個(gè)對(duì)比序列化器性能的例子簡(jiǎn)單介紹JMH的使用一汽。

創(chuàng)建項(xiàng)目

不同于 JUnit 這種測(cè)試框架,JMH推薦創(chuàng)建獨(dú)立的項(xiàng)目來做測(cè)試。

使用maven創(chuàng)建

mvn archetype:generate \
-DinteractiveMode=false \
-DarchetypeGroupId=org.openjdk.jmh \
-DarchetypeArtifactId=jmh-java-benchmark-archetype \
-DgroupId=org.sample \
-DartifactId=test \
-Dversion=1.0

執(zhí)行命令后生成項(xiàng)目

IDEA中創(chuàng)建項(xiàng)目

除了maven命令直接創(chuàng)建之外召夹,也可以選擇在IDE中創(chuàng)建maven岩喷,以IDEA為例。

在創(chuàng)建項(xiàng)目時(shí)监憎,選擇Maven項(xiàng)目纱意,勾選 Create from archetype 并選擇 Add Archetype...

在彈出的窗口中填入對(duì)應(yīng)信息(當(dāng)前最新版本為1.33)

增加archetype

之后就可以選擇JMH的archetype在IDEA中創(chuàng)建項(xiàng)目了。

編寫測(cè)試代碼

項(xiàng)目自動(dòng)生成的 pom.xml 文件中已經(jīng)包含JMH運(yùn)行最小依賴了鲸阔,只需要加上待測(cè)試相關(guān)的依賴包偷霉。這里我要測(cè)試的是 spring-data-redis 中序列化對(duì)象相關(guān)的內(nèi)容,因此需要添加以下依賴:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
    <version>2.1.1.RELEASE</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-core -->
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-core</artifactId>
    <version>2.12.3</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind -->
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.12.3</version>
</dependency>

之后編寫測(cè)試代碼褐筛,這里我使用了對(duì)比了 ObjectHashMapperJackson2HashMapper 兩個(gè)類的 toHash 方法平均調(diào)用時(shí)間类少。預(yù)熱5輪硫狞,實(shí)際測(cè)試5輪并fork 5 個(gè)進(jìn)程來進(jìn)行測(cè)試妓忍。

@BenchmarkMode(Mode.AverageTime)
@OutputTimeUnit(TimeUnit.NANOSECONDS)
@Warmup(iterations = 5, time = 1)
@Measurement(iterations = 5, time = 1)
@Fork(5)
@State(Scope.Benchmark)
public class MyBenchmark {

private HashMapper objectHashMapper;
 private HashMapper jacksonHashMapper;

 @Setup
 public void setup() {
    objectHashMapper = new ObjectHashMapper();
 jacksonHashMapper = new Jackson2HashMapper(false);
 }

@Benchmark
 public void testObjectHashMapper() {
    SesAnswerRate answerRatePredictor = new SesAnswerRate(0.3F, 0.5F);
 objectHashMapper.toHash(answerRatePredictor);
 }

@Benchmark
 public void testJacksonHashMapper() {
    SesAnswerRate answerRatePredictor = new SesAnswerRate(0.3F, 0.5F);
 jacksonHashMapper.toHash(answerRatePredictor);
 }

public static void main(String[] args) throws RunnerException {
    Options options = new OptionsBuilder()
            .include(MyBenchmark.class.getSimpleName())
            .build();
 new Runner(options).run();
 }
}

建議IDEA用戶安裝idea-jmh-plugin插件定罢,便于運(yùn)行測(cè)試。

執(zhí)行測(cè)試

如果沒有安裝IDE插件琼蚯,可以執(zhí)行 mvn clean package 打包惠况,之后在項(xiàng)目下的target文件夾中執(zhí)行 java -jar benchmarks.jar 運(yùn)行。

最終運(yùn)行結(jié)果如下:

Benchmark                          Mode  Cnt     Score     Error  Units
MyBenchmark.testJacksonHashMapper  avgt   25   536.386 ±  25.589  ns/op
MyBenchmark.testObjectHashMapper   avgt   25  1601.561 ± 139.910  ns/op

可以看到使用 Jackson2HashMapper 序列化對(duì)象的速度要比 ObjectHashMapper 快上3倍峦睡。

總結(jié)

可以看到利用JMH能夠快速編寫,運(yùn)行測(cè)試代碼龙屉,對(duì)于method級(jí)別的性能測(cè)試非常有用转捕,篇幅所限在此不展開講述更加具體的用法瓜富。

建議有需要的同學(xué)們閱讀官方示例: jmh-samples

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末鳍咱,一起剝皮案震驚了整個(gè)濱河市谤辜,隨后出現(xiàn)的幾起案子结蟋,更是在濱河造成了極大的恐慌推正,老刑警劉巖植榕,帶你破解...
    沈念sama閱讀 206,602評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件寝衫,死亡現(xiàn)場(chǎng)離奇詭異慰毅,居然都是意外死亡扎阶,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,442評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門贵扰,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人耘子,你說我怎么就攤上這事∏蚯校” “怎么了谷誓?”我有些...
    開封第一講書人閱讀 152,878評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)吨凑。 經(jīng)常有香客問我捍歪,道長(zhǎng),這世上最難降的妖魔是什么鸵钝? 我笑而不...
    開封第一講書人閱讀 55,306評(píng)論 1 279
  • 正文 為了忘掉前任糙臼,我火速辦了婚禮,結(jié)果婚禮上恩商,老公的妹妹穿的比我還像新娘变逃。我一直安慰自己,他們只是感情好痕届,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,330評(píng)論 5 373
  • 文/花漫 我一把揭開白布韧献。 她就那樣靜靜地躺著末患,像睡著了一般研叫。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上璧针,一...
    開封第一講書人閱讀 49,071評(píng)論 1 285
  • 那天嚷炉,我揣著相機(jī)與錄音,去河邊找鬼探橱。 笑死申屹,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的隧膏。 我是一名探鬼主播哗讥,決...
    沈念sama閱讀 38,382評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼胞枕!你這毒婦竟也來了杆煞?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,006評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎决乎,沒想到半個(gè)月后队询,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,512評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡构诚,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,965評(píng)論 2 325
  • 正文 我和宋清朗相戀三年蚌斩,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片范嘱。...
    茶點(diǎn)故事閱讀 38,094評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡送膳,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出丑蛤,到底是詐尸還是另有隱情肠缨,我是刑警寧澤,帶...
    沈念sama閱讀 33,732評(píng)論 4 323
  • 正文 年R本政府宣布盏阶,位于F島的核電站晒奕,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏名斟。R本人自食惡果不足惜脑慧,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,283評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望砰盐。 院中可真熱鬧闷袒,春花似錦、人聲如沸岩梳。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,286評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽冀值。三九已至也物,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間列疗,已是汗流浹背滑蚯。 一陣腳步聲響...
    開封第一講書人閱讀 31,512評(píng)論 1 262
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留抵栈,地道東北人告材。 一個(gè)月前我還...
    沈念sama閱讀 45,536評(píng)論 2 354
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像古劲,于是被迫代替她去往敵國(guó)和親斥赋。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,828評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容