热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

JMH基准测试研究

JMHBenchMark叫做基准测试,主要是用来测试一些方法的性能,可以根据不同参数,以不同的单位进行计算。可以通过设置Benchma

JMH

BenchMark 叫做基准测试,主要是用来测试一些方法的性能,可以根据不同参数,以不同的单位进行计算。

可以通过设置BenchmarkMode 参数来设置是使用吞吐量为单位还是平均时间作为单位

Java Benchmark Harness, JMH是专门用于代码微基准测试的工具套件。这里的微,就是可以基于方法层面,精度可以达到毫秒级别。

JMH的 主要应用场景:

1.想准确的知道某个方法需要执行多长时间以及与传参之间的关系

2.对比同一个接口,在不同条件下的吞吐量

3.查看单位时间能执行多少强求

入门实现

首先JMH有一个实现清单示例清单。不得不说英文资料只要想找比中文资料要多得多。我们这里来实现下hello world

添加pom依赖:

org.openjdk.jmhjmh-core1.19

org.openjdk.jmhjmh-generator-annprocess1.19provided

这里需要注意,我第一下是用0.17版本,然后在代码里面添加@Benchmark 注解的时候,一直引不到包。后来发现就是这里的版本问题,写到1.19就没有问题了。

public class HelloWorld {@Benchmarkpublic void hello(){}public static void main(String[] args) throws RunnerException {Options opt = new OptionsBuilder().include(HelloWorld.class.getSimpleName()).forks(1).build();new Runner(opt).run();}
}

执行后的输出结果是:

# JMH version: 1.19
# VM version: JDK 1.8.0_181, VM 25.181-b13
# VM invoker: D:\Program Files\Java\jdk1.8.0_181\jre\bin\java.exe
# VM options: -Dvisualvm.id=610415878661292 -javaagent:D:\Program
Files\JetBrains\IntelliJ IDEA 2018.3\lib\idea_rt.jar=63740:D:\Program
Files\JetBrains\IntelliJ IDEA 2018.3\bin -Dfile.encoding=UTF-8
# Warmup: 20 iterations, 1 s each
# Measurement: 20 iterations, 1 s each
# Timeout: 10 min per iteration
# Threads: 1 thread, will synchronize iterations
# Benchmark mode: Throughput, ops/time
# Benchmark: jmh.HelloWorld.hello# Run progress: 0.00% complete, ETA 00:00:40
# Fork: 1 of 1
# Warmup Iteration 1: 3001357376.599 ops/s
# Warmup Iteration 2: 3224879376.706 ops/s
# Warmup Iteration 3: 3216559672.446 ops/s
# Warmup Iteration 4: 3131575191.942 ops/s
# Warmup Iteration 5: 3149948207.385 ops/s
# Warmup Iteration 6: 2830803401.832 ops/s
# Warmup Iteration 7: 3070451939.640 ops/s

里面具体的Warmup  ,Benchmark mode , threads都是JMH 中的一些特有概念。

基本概念

Mode 

Mode 表示 JMH 进行 Benchmark 时所使用的模式。通常是测量的维度不同,或是测量的方式不同。目前 JMH 共有四种模式:

  1. Throughput: 整体吞吐量,例如“1秒内可以执行多少次调用”。
  2. AverageTime: 调用的平均时间,例如“每次调用平均耗时xxx毫秒”。
  3. SampleTime: 随机取样,最后输出取样结果的分布,例如“99%的调用在xxx毫秒以内,99.99%的调用在xxx毫秒以内”
  4. SingleShotTime: 以上模式都是默认一次 iteration 是 1s,唯有 SingleShotTime 是只运行一次。往往同时把 warmup 次数设为0,用于测试冷启动时的性能。

Interation 

Iteration是JMH进行测试的最小单位。大部分模式下,iteration代表的是一秒,JMH会在这一秒内不断调用需要benchmark的方法,然后根据模式对其采样,计算吞吐量,计算平均执行时间等。

Warmup 

Warmup是指在实际进行Benchmark前先进行预热的行为。因为JVM的JIT机制的存在,如果某个函数被调用多次以后,JVM会尝试将其编译成为机器码从而提高执行速度。所以为了让benchmark的结果更加接近真实情况就需要进行预热。

注解

现在来解释一下上面例子中使用到的注解,其实很多注解的意义完全可以望文生义 :

@Benchmark 
表示该方法是需要进行 benchmark 的对象,用法和 JUnit 的 @Test 类似。

@Mode
Mode 如之前所说,表示 JMH 进行 Benchmark 时所使用的模式。

@State
State 用于声明某个类是一个“状态”,然后接受一个 Scope 参数用来表示该状态的共享范围。因为很多 benchmark 会需要一些表示状态的类,JMH 允许你把这些类以依赖注入的方式注入到 benchmark 函数里。Scope 主要分为两种。

  1. Thread: 该状态为每个线程独享。
  2. Benchmark: 该状态在所有线程间共享。
     

@OutputTimeUnit
benchmark 结果所使用的时间单位。

fork

进行 fork 的次数。如果 fork 数是2的话,则 JMH 会 fork 出两个进程来进行测试。

warmupIterations

预热的迭代次数。

measurementIterations

实际测量的迭代次数。

 


推荐阅读
  • XNA 3.0 游戏编程:从 XML 文件加载数据
    本文介绍如何在 XNA 3.0 游戏项目中从 XML 文件加载数据。我们将探讨如何将 XML 数据序列化为二进制文件,并通过内容管道加载到游戏中。此外,还会涉及自定义类型读取器和写入器的实现。 ... [详细]
  • 实体映射最强工具类:MapStruct真香 ... [详细]
  • 本文介绍如何在Linux Mint系统上搭建Rust开发环境,包括安装IntelliJ IDEA、Rust工具链及必要的插件。通过详细步骤,帮助开发者快速上手。 ... [详细]
  • 本文将介绍如何编写一些有趣的VBScript脚本,这些脚本可以在朋友之间进行无害的恶作剧。通过简单的代码示例,帮助您了解VBScript的基本语法和功能。 ... [详细]
  • Explore how Matterverse is redefining the metaverse experience, creating immersive and meaningful virtual environments that foster genuine connections and economic opportunities. ... [详细]
  • 本文深入探讨了 Java 中的 Serializable 接口,解释了其实现机制、用途及注意事项,帮助开发者更好地理解和使用序列化功能。 ... [详细]
  • 本文介绍了如何在C#中启动一个应用程序,并通过枚举窗口来获取其主窗口句柄。当使用Process类启动程序时,我们通常只能获得进程的句柄,而主窗口句柄可能为0。因此,我们需要使用API函数和回调机制来准确获取主窗口句柄。 ... [详细]
  • 本文详细解析了Python中的os和sys模块,介绍了它们的功能、常用方法及其在实际编程中的应用。 ... [详细]
  • 本文介绍了如何通过 Maven 依赖引入 SQLiteJDBC 和 HikariCP 包,从而在 Java 应用中高效地连接和操作 SQLite 数据库。文章提供了详细的代码示例,并解释了每个步骤的实现细节。 ... [详细]
  • andr ... [详细]
  • Scala 实现 UTF-8 编码属性文件读取与克隆
    本文介绍如何使用 Scala 以 UTF-8 编码方式读取属性文件,并实现属性文件的克隆功能。通过这种方式,可以确保配置文件在多线程环境下的一致性和高效性。 ... [详细]
  • 深入探讨CPU虚拟化与KVM内存管理
    本文详细介绍了现代服务器架构中的CPU虚拟化技术,包括SMP、NUMA和MPP三种多处理器结构,并深入探讨了KVM的内存虚拟化机制。通过对比不同架构的特点和应用场景,帮助读者理解如何选择最适合的架构以优化性能。 ... [详细]
  • 本文探讨了 Spring Boot 应用程序在不同配置下支持的最大并发连接数,重点分析了内置服务器(如 Tomcat、Jetty 和 Undertow)的默认设置及其对性能的影响。 ... [详细]
  • 深入解析 Spring Security 用户认证机制
    本文将详细介绍 Spring Security 中用户登录认证的核心流程,重点分析 AbstractAuthenticationProcessingFilter 和 AuthenticationManager 的工作原理。通过理解这些组件的实现,读者可以更好地掌握 Spring Security 的认证机制。 ... [详细]
  • 微软Exchange服务器遭遇2022年版“千年虫”漏洞
    微软Exchange服务器在新年伊始遭遇了一个类似于‘千年虫’的日期处理漏洞,导致邮件传输受阻。该问题主要影响配置了FIP-FS恶意软件引擎的Exchange 2016和2019版本。 ... [详细]
author-avatar
刘国彬2012_380
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有