• 0
  • 0
分享
  • Java微基准测试神器JMH初探
  • FunTeste 2023-04-03 13:25:45 字数 2895 阅读 965 收藏 0

当我们编写一段Java代码之后,如果想知道代码性能如何,就需要进行一些快速的性能测试。

当我们实现一个需求,面临2种及以上的方案,选择一种性能更好的方案时,也需要进行一些快速的性能测试。

在之前的实践中,我一开始的测试代码通常是这样的:

    public static void main(String[] args) {
        long start = System.currentTimeMillis();
        for (int i = 0; i < 100000; i++) {
            doSomething();
        }
        long end = System.currentTimeMillis();
        System.out.println(end - start);
    }

再到后来,变成这种:

    public static void main(String[] args) {
        def test = {
                doSomething()
        }
        new FunQpsConcurrent(test, "Demo").start();
    }

但最近又有了新的工具JMH(Java Microbenchmark Harness)是用于代码微基准测试的工具套件,主要是基于方法层面的基准测试,精度可以达到纳秒级。该工具是由 Oracle 内部实现 JIT 的大牛们编写的,他们应该比任何人都了解 JIT 以及 JVM 对于基准测试的影响。

真可谓相见恨晚,上手也是非常迅速的,建议学习时间2小时,顺便看看官方GitHub仓库里面的错误示范,地址:https://github.com/lexburner/JMH-samples。

PS:

  • 如果你用的Intellij,插件是真香。
  • 如果要汇报,建议使用可视化工具,搜一下就有。

下面我分享一下我用JMH测试System.currentTimeMillis();和System.nanoTime();两个方法的性能。外行大胆猜测,第二个方法应该性能比较差。原因是第二个方法获取到纳秒时间戳,应该会更消耗性能。

这是我的测试用例:

package com.funtest.groovytest;

import com.funtester.frame.SourceCode;
import org.openjdk.jmh.annotations.*;
import org.openjdk.jmh.results.format.ResultFormatType;
import org.openjdk.jmh.runner.Runner;
import org.openjdk.jmh.runner.RunnerException;
import org.openjdk.jmh.runner.options.Options;
import org.openjdk.jmh.runner.options.OptionsBuilder;

import java.util.concurrent.TimeUnit;

@BenchmarkMode(Mode.Throughput)
@Warmup(iterations = 2, time = 5, timeUnit = TimeUnit.SECONDS)
@Measurement(iterations = 5, time = 10, timeUnit = TimeUnit.SECONDS)
@Threads(2)
@Fork(1)
@State(value = Scope.Thread)
@OutputTimeUnit(TimeUnit.NANOSECONDS)
public class JmhT extends SourceCode {


    @Param(value = {"10", "20", "50"})
    private int length;

    @Benchmark
    public void mill() {
        System.currentTimeMillis();
    }

    @Benchmark
    public void nano() {
        System.nanoTime();
    }

    public static void main(String[] args) throws RunnerException {
        Options options = new OptionsBuilder()
                .include(JmhT.class.getSimpleName())
                .result("result.json")
                .resultFormat(ResultFormatType.JSON)
                .forks(1)
                .threads(20)
                .warmupIterations(2)
                .warmupBatchSize(1)
                .measurementIterations(2)
                .measurementBatchSize(2)
                .build();
        new Runner(options).run();
    }

}

最后的main方法是为了生产result.json做可视化用的,如果单纯想知道性能差异,可以直接使用Intellij插件完成。用例中的length完全不用,只是想展示一下参数化的用法。

文字版测试结果如下:

Benchmark  (length)   Mode  Cnt  Score   Error   Units
JmhT.mill        10  thrpt    2  0.015          ops/ns
JmhT.mill        20  thrpt    2  0.015          ops/ns
JmhT.mill        50  thrpt    2  0.016          ops/ns
JmhT.nano        10  thrpt    2  0.091          ops/ns
JmhT.nano        20  thrpt    2  0.088          ops/ns
JmhT.nano        50  thrpt    2  0.084          ops/ns

总体看就是System.nanoTime();性能要远远优于System.currentTimeMillis();,这是不是有点意外。

  • 【留下美好印记】
    赞赏支持
登录 后发表评论
+ 关注

热门文章

    最新讲堂

      • 推荐阅读
      • 换一换
          • 9 月 5 日消息,据腾讯 QQ 官方消息,在开学之际,QQ 上线了“QQ 学生卡”,可一键查看你的 Q 龄。在 QQ 搜索“QQ 学生卡”,即可查看你的 Q 龄。据了解,QQ 是 1999 年 2 月由腾讯开发的一款基于互联网的即时通信软件,最初称为 OICQ。2000 年 11 月,腾讯推出 QQ2000 版本,将名称由 OICQ 更名为 QQ。根据腾讯 2021 年财报,QQ 移动端月活跃账户数为 5.52 亿。作者:孤城文章来源:IT之家 (ithome.com)
            0 0 644
            分享
          •   先说结论,渗透测试这个方向肯定还是有前途的。  一方面,随着网络和信息安全问题日益突出,渗透测试的需求也在不断增加,因此渗透测试人才的市场需求仍旧稳定存在。  另一方面,渗透测试也是一个非常专业的领域,需要掌握多种技能和工具,对人才的要求较高。  因此一些专业的渗透测试人才仍旧有着较好的职业发展前景。  当然,如果要进入渗透测试行业,还需要不断学习、提升自己的技能,在实践中积累经验。  可以通过参加培训、参与开源项目、参加比赛等方式提高自己的专业水平。  为什么要学渗透测试  学渗透测试的好处不外乎以下几点:  心理满足感。很酷,就像小时候看黑客的电影一样,自己也成为了他们。  有一份可观...
            0 0 177
            分享
          •   先上我的结论:  只会简单的测试,没前途。  会中级的测试技能,短期内不愁,但长期不好说。  掌握开发技能,将会提升你在行业中的竞争力。  ★为什么测试也要懂开发?  一、懂开发,增强职场的抗风险能力。  臻叔希望大家明白一个道理:不懂开发的测试可替代性强,甚至开发都可以在一定程度上做简单的测试。  举个例子:  百词斩app,考过英语四六级的应该都知道,也算是小而美的一家有知名度的企业。但这种量级的公司,居然没有测试,基本上都靠开发自测bug。  大公司RD(开发)和QA(测试)的人员比大概是3:1,也就是3个开发(2个前端、1个后端)配1个测试。但我估计非一线城市+小公司的前提下,这个...
            0 0 1047
            分享
          •   摘要:性能测试通过自动化的测试工具模拟正常、异常场景来对系统的各项性能指标进行测试。通过性能测试可以分析一个系统能力、瓶颈、关键问题等。本文结合直播平台的部分场景,使用开源SRS-Bench工具对直播并的4个场景进行压力测试,测试直播平台的基础能力。  一 、性能测评工具简介  性能测试范围较广,包含负载测试、压力测试等,负载测试可以确定在满足性能指标情况下,系统能承受的最大负载,压力测试可以确定在什么负载条件下系统性能处于失效状态,获得系统能提供的最大的服务级别,一般系统上线前均会进行性能测试。目前,较常用的性能测试工具分为商业测试工具、开源测试工具,较为常用的是Loadrunner及J...
            0 0 10711
            分享
          •   面试中遇到的现场编码挑战,特别是那些故意设计来让你失败的挑战,确实会让人感到不悦。这里有12个关于Playwright的面试问题及答案,希望能给你一些优势。  这些问题的创建是为了迷惑你,所以如果你没有答对,也不要对自己太苛刻。同时,一些答案包含解释和代码示例。请滚动到页面底部查看。  1. 本地环境  如果你在本地机器上使用你需要设置并启动的本地环境运行测试,例如在 http://localhost:3000/,你将如何在测试运行期间处理本地环境的设置?  可能的答案:  · 在运行测试之前启动你的本地环境  · 在package.json中编写一个脚本来启动本地环境...
            0 0 700
            分享
      • 51testing软件测试圈微信