Java代码性能测试实战之ContiPerf

javalover123
• 阅读 285

一、前言

  • 最近测试一个开源项目,发现生成的 全局id 有重复,方法加上 synchronized 提交PR后,有些同行对性能有疑虑,就准备做个 代码性能测试
  • Java基准性能测试 一般用 JMH 比较多,但是 官方建议 性能测试单独一个项目,感觉麻烦了点
  • 后面发现了 ContiPerf,可以方便的设置 执行次数、时长、线程数、预热时长,还有 Html格式报告,感觉还比较适合,基于 Junit

二、ContiPerf

1. 安装

  • 有2个仓库,这里选择 javatlacati 二开以后的
  • 选择 2.4.3 版本,基于 Junit4,更好的支持 @After
  • 另最新 2.4.4-SNAPSHOT 版本,基于Junit5
      <dependencies>
          <!-- 引入 ContiPerf 测试工具,参考 https://gitee.com/yu120/sequence -->
          <dependency>
              <groupId>com.github.javatlacati</groupId>
              <artifactId>contiperf</artifactId>
              <version>2.4.3</version>
              <scope>test</scope>
          </dependency>
      </dependencies>

2. 使用

  • 首先,单元测试类 增加属性 ContiPerfRule

  • 测试方法增加 Junit4 的 @Test 注解

  • 增加 @PerfTest,配置 invocations 次数,或 duration 毫秒时长,threads 线程数

  • 性能测试嘛,最好配置 预热时长 warmUp,单位也是 毫秒

  • 多种不同线程数的测试,可以 多个方法加 @PerfTest 注解哦(这种情况建议把 线程数加到 测试方法名末尾,线程数小于 10的 补0,同时测试类增加 @FixMethodOrder(MethodSorters.NAME_ASCENDING),生成的 报告就按 线程数排序了)

  • 还可以配置 @Required 结果校验哦,如下示例:每秒吞吐量要 大于等于 100万

      @org.junit.Rule
      public ContiPerfRule contiPerfRule = new ContiPerfRule();
    
      @org.junit.Test
      @com.github.javatlacati.contiperf.Required(throughput = 100_0000)
      @PerfTest(duration = 3300, threads = 4, warmUp = 300)
      public void generateId04Threads() {
          generateIdThreads();
      }

3. 性能测试效果

  • 所有的 PerfTest 结果都输出到 target/contiperf-report/index.html Java代码性能测试实战之ContiPerf

4. 示例2:多线程生成id,有无重复校验

  • ids 要使用 支持并发的容器,不然多线程 会报错

  • @AfterClass 做结果校验

      private static final Set<Long> ids = new ConcurrentHashSet<>((int) (INVOCATIONS / 0.7));
      @AfterClass
      public static void tearDown() {
          Assert.assertEquals("generateId duplicated", INVOCATIONS, ids.size());
      }
    
      @Test @PerfTest(invocations = INVOCATIONS, threads = 4)
      public void generateId() {
          ids.add(UniqueIdGenerator.generateId());
      }

三、总结

  • ContiPerf,可以方便的设置 执行次数、时长、线程数、预热时长,还有 Html格式报告,是个比较便捷的 代码性能测试工具
  • 更专业的 Java 微基准性能测试,也可以考虑 JMH

本文遵守【CC BY-NC】协议,转载请保留原文出处及本版权声明,否则将追究法律责任。
本文首先发布于 https://www.890808.xyz/ ,其他平台需要审核更新慢一些。

Java代码性能测试实战之ContiPerf

点赞
收藏
评论区
推荐文章
捉虫大师 捉虫大师
2年前
盘点golang中的开发神器
本文已收录https://github.com/lkxiaolou/lkxiaolou欢迎star。在Java中,我们用Junit做单元测试,用JMH做性能基准测试(benchmark),用asyncprofiler剖析cpu性能,用jstack、jmap、arthas等来排查问题。作为一名比较新的编程语言,golang的这些工具是否更加好用呢?单元测
Wesley13 Wesley13
2年前
java 性能测试框架工具
性能测试工具对于Java开发者来说,要去学习性能测试工具未免很麻烦。但有时候会有性能测试的需求。junitperfjunitperf(https://www.oschina.net/action/GoToLink?urlhttps%3A%2F%2Fgithub.com%2Fhoubb%2Fjunit
Stella981 Stella981
2年前
JUnit学习笔记
JUnitJJUnit是用于编写和运行可重复的自动化测试的开源测试框架,这样可以保证我们的代码按预期工作。JUnit可广泛用于工业和作为支架(从命令行)或IDE(如Eclipse)内单独的Java程序。基础知识JUnit的安装和使用都非常的简单。这里使用IDEAMaven演示。创建项目使用Ide
Wesley13 Wesley13
2年前
Java基础学习总结(24)——Java单元测试之JUnit4详解
Java单元测试之JUnit4详解与JUnit3不同,JUnit4通过注解的方式来识别测试方法。目前支持的主要注解有:@BeforeClass 全局只会执行一次,而且是第一个运行@Before 在测试方法运行之前运行@Test(http://my.oschina.net/azibug) 测试方法
Easter79 Easter79
2年前
Twitter的分布式自增ID算法snowflake (Java版)
概述分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。而twitter的snowflake解决了这种需求,最初Twitter把存储系统从MySQL迁移
Wesley13 Wesley13
2年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Stella981 Stella981
2年前
Jmeter之java请求
ApacheJmeter是开源、易用的性能测试工具,之前工作中用过几次对http请求进行性能测试,对jmeter的基本操作有一些了解。最近接到开发的对java请求进行性能测试的需求,所以需要写java请求的脚本。Java请求的性能测试与http请求的性能测试类似,都是给远程应用提供的服务发送请求并施压,得到响应结果及性能数据。不同的是,http调用的是
Wesley13 Wesley13
2年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
javalover123 javalover123
10个月前
Testng和Junit5多线程并发测试对比
最近测试一个开源项目,发现生成的全局id有重复,也没有单元测试,就准备贡献个PR。想到多线程并发测试,根据经验,第一想法是用Testng,后面看了下Junit5也有实验性支持了,就对比下(以maven为例)
京东云开发者 京东云开发者
6个月前
Java服务总在半夜挂,背后的真相竟然是... | 京东云技术团队
最近有用户反馈测试环境Java服务总在凌晨00:00左右挂掉,用户反馈Java服务没有定时任务,也没有流量突增的情况,Jvm配置也合理,莫名其妙就挂了
javalover123
javalover123
Lv1
10年Java经验,多个开源项目贡献者。https://github.com/javalover123
文章
16
粉丝
2
获赞
5