使用JMH工具进行性能测试

介绍

JMH,即Java Microbenchmark Harness,从名字就可以看出,这是专门用于进行代码的微基准测试的一套工具API。它为我们进行微基准测试提供了一系列的方法,帮助使用者屏蔽在微基准测试中容易产生的随机性误差。

开始使用

因为这一套工具API尚未加入到标准的JavaAPI中,因此,在使用的时候需要另外依赖一些jar包。同时考虑到,微基准测试一般是用于应用程序的发布或者一些性能相关的代码变更,在正常的工程中,往往不需要长期依赖这些测试代码,因此,在正式的文档中,也建议使用者,以独立的微基准测试工程的形式使用,需要测试的代码,通过jar依赖的方式添加到微基准测试的工程中。

使用Maven创建微基准测试工程

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

通过官方提供的Maven archetype就可以创建出标准的JMH微测试工程,创建之后,会默认创建一个微测试的类MyBenchmark:

public class MyBenchmark {   
    @Benchmark   
    public void testMethod() {       
        // This is a demo/sample template for building your JMH benchmarks. Edit as needed.       
        // Put your benchmark code here   
    }
}

在官方提供的文档中,JMH的运行都是通过CLI进行的,但往往我们实际进行开发的时候都是使用IDE进行的,再最后会再简单介绍一下使用Intellij IDEA运行的方法。

使用JMH进行gs-collections测试

gs-collections是高盛开源出来的一个,它的具体介绍可以看看引用部分的链接。这里主要是用gs-collections作为例子来了解一下JMH的一些基本使用。

测试用例:gs-collections stream VS Java 8 stream

这个测试用例主要就是统计一下一个List中有多少个偶数:

@BenchmarkMode(Mode.Throughput)
public class CountTest {

    @Benchmark
    @Warmup(iterations = 2)
    @Measurement(iterations = 2)
    public void serialLazyJDK() {
        long evens = integersJDK.stream().filter(each -> each % 2 == 0).count();
        Assert.assertEquals(SIZE / 2, evens);
    }

    @Benchmark
    @Warmup(iterations = 2)
    @Measurement(iterations = 2)
    public void serialLazyGSC() {
        long evens = integersGSC.count(each -> each % 2 == 0);
        Assert.assertEquals(SIZE / 2, evens);
    }

    private static final int SIZE = 1_000_000;
    public final List<Integer> integersJDK = new ArrayList<>(Interval.oneTo(SIZE));
    public final FastList<Integer> integersGSC = new FastList<>(Interval.oneTo(SIZE));
}

首先,这里的每一个方法就跟一般的JUnit方法类似,每一个方法就是一个测试用例。那么因为我们现在是在做Benchmark,因此,最终的结果就是每一个被加上@Benchmark注解的方法的比较结果。所以,@Benchmark注解是用来标注待测试方法的。
留意到在类上有@BenchmarkMode的注解,里面的参数,Mode.Throughput,表示这个Benchmark主要是测试吞吐量的对比。在JMH中,还另外提供了测试平均运行时间等模式的测试方式。
一开始也提到,JMH就是为了解决一般的微基准测试中,容易受其他因素影响所造成的误差,因此,JMH提供了Warmup的机制,以及多次循环的测试方式。

使用IDEA运行微基准测试

跟JUnit等测试框架类似,在IDE中运行JMH测试需要额外的插件支持。在IDEA中,我们只需要在Plugins的列表中,搜索一下JMH关键字,就能找到JMH Plugin,然后安装下来,重启一下IDEA,就能运行JMH微测试。

Reference

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,445评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,889评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,047评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,760评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,745评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,638评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,011评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,669评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,923评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,655评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,740评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,406评论 4 320
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,995评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,961评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,023评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,483评论 2 342

推荐阅读更多精彩内容

  • 官方中文版原文链接 感谢社区中各位的大力支持,译者再次奉上一点点福利:阿里云产品券,享受所有官网优惠,并抽取幸运大...
    HetfieldJoe阅读 1,327评论 0 5
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,429评论 25 707
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,594评论 18 139
  • 我只是在此处重述一个在我的梦境中真实发生的故事。 时间,黄梅时节。地点,一个拍摄古装的电影城。人物,一个男人和...
    不耕田的牛阅读 263评论 0 0
  • 一、OC基本语法 //整型 NSInteger a = 10; //浮点型 CGFloat b = 2.3; //...
    GOT_HODOR阅读 302评论 0 0