几种性能测试工具的总结 我们经常会谈论性能、并发等问题,但是衡量性能不是说写段代码循环几百次这么简单。最近从项目上的同事了解到了代码化的测试性能测试工具 k6,以及结合之前用过的Java 微基准测试 (JMH)、AB (Apache Benchmark) 测试、Jmeter 做一下总结。 谈性能,实际上结合实际的业务背景、网络条件、测试数据的选择等因素影响非常大,单纯的谈 QPS 等数据意义不大。 这里介绍的几个工具刚好能满足平时开发工作中不同场景下衡量性能的需求,因此整理出来。Java 微基准测试 (JMH) 可以用于衡量一段 Java 代码到底性能如何,例如我们平时总是谈 StringBuilder 比 new String() 快很多。我们有一个很好地量化方法,就可以很直观的展示出一段代码的性能优劣。AB (Apache Benchmark) 测试是 Apache 服务器内置的一个 http web 压测工具,非常简单易用。Mac 预装了 Apache,因此可以随手使用来测试一个页面或者 API 的性能。贵在简单易用,无需额外安装。k6 一款使用 go 语言编写,支持用户编写测试脚本的测试套件。弥补了 ab 测试功能不足,以及 jemeter 不容易代码化的缺点。也是项目上需要使用,从同事那里了解到的。Jmeter 老牌的性能测试工具,有大量专门讲 jmeter 的资料,本文不再赘述。 那我们从 JMH 开始从来看下这几个工具的特点和使用吧。 Java 微基准测试 StringBuilder 到底比 new String() 快多少呢? 我们可以使用 JMH 来测试一下。JMH 是一个用于构建、运行和分析 Java 方法运行性能工具,可以做到 nano/micro/mili/macro 时间粒度。JMH 不仅可以分析 Java 语言,基于 JVM 的语言都可以使用。 JMH 由 OpenJDK 团队开发,由一次下载 OpenJDK 时注意到官网还有这么一个东西。 OpenJdk 官方运行 JMH 测试推的方法是使用 Maven 构建一个单独的项目,然后把需要测试的项目作为 Jar 包引入。这样能排除项目代码的干扰,得到比较可靠地测试效果。当然也可以使用 IDE 或者 Gradle 配置到自己项目中,便于和已有项目集成,代价是配置比较麻烦并且结果没那么可靠。 使用 Maven 构建基准测试 根据官网的例子,我们可以使用官网的一个模板项目。 mvn archetype:generate \ -DinteractiveMode=false \ -DarchetypeGroupId=org.openjdk.jmh \ -DarchetypeArtifactId=jmh-java-benchmark-archetype \ -DgroupId=org.sample \ -DartifactId=test \ -Dversion=1.0 创建一个项目,导入 IDE,Maven 会帮我们生成一个测试类,但是这个测试类没有任何内容,这个测试也是可以运行的。 先编译成 jar mvn clean install 然后使用 javar -jar 来运行测试 java -jar target/benchmarks.jar 运行后可以看到输出信息中包含 JDK、JVM 等信息,以及一些用于测试的配置信息。 下面是一些配置信息说明Warmup 因为 JVM 即时编译的存在,所以为了更加准确有一个预热环节,这里是预热 5,每轮 10s。Measurement 是真实的性能测量参数,这里是 5轮,每轮10s。Timeout 每轮测试,JMH 会进行 GC 然后暂停一段时间,默认是 10 分钟。Threads 使用多少个线程来运行,一个线程会同步阻塞执行。Benchmark mode 输出的运行模式,常用的有下面几个。Throughput 吞吐量,即每单位运行多少次操作。AverageTime 调用的平均时间,每次调用耗费多少时间。SingleShotTime 运行一次的时间,如果把预热关闭可以测试代码冷启动时间Benchmark 测试的目标类 实际上还有很多配置,可以通过 -h 参数查看 java -jar target/benchmarks.jar -h 由于默认的配置停顿的时间太长,我们通过注解修改配置,并增加了 Java 中最基本的字符串操作性能对比。 在控制台可以看到输出的测试报告,我们直接看最后一部分即可。 Score 这列的意思是每毫秒完成了多少次操作,可见 StringBuilder 确实比普通的 String 构造器性能高很多。 更多有趣的测试 实际上平时 Java 开发中一些细节对性能有明显的影响,虽然对系统整体来说影响比较小,但是注意这些细节可以低成本的避免性能问题堆积。 其中一个非常有意思细节是自动包装类型的使用,即使是一个简单的 for 循环,如果不小心讲 int 使用成 Integer 也会造成性能浪费。 我们来编写一个简单的基准测试 运行测试后,得到下面的测试结果 基本类型的性能高出了一个数量级。当然你可能会说基本类型这种性能问题比较微小,但是性能往往就是这种从细微处提高的。另外编写 JMH 测试也会让团队看待性能问题更为直观。 一份直观的 Java 基础性能报告 下面是我写的常见场景的性能测试,例如 StringBuilder 比 new String() 速度快几个数量级。
2024最新激活全家桶教程,稳定运行到2099年,请移步至置顶文章:https://sigusoft.com/99576.html
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。 文章由激活谷谷主-小谷整理,转载请注明出处:https://sigusoft.com/33795.html