当前位置: 首页 > 网络应用技术

JMH Java方法性能基准测试

时间:2023-03-07 01:57:42 网络应用技术

  JMH,(Java Microbenchmark线束),是专门用于Java Code Micro -Base测试的工具套件。什么是微型基准测试?简而言之,它是基于方法级别的基准测试,并且准确性可以到达微秒。位于热点方法中,您希望进一步优化性能,可以使用JMH分析优化的结果。

  标准测试:指科学测试方法,测试工具和测试系统,以实现一种测试对象类型的性能指标的定量和比较测试。某些条件或在特定条件下,例如图形卡,IO,CPU等。

  JMH的典型应用程序方案是:

  JMH由JDK9带来,但是我们可以通过导入相关依赖项或JAR软件包来使用它。

  @benchmark注释表明,此方法是需要基准测试的方法。

  @benchmarkmode表示JMH测量方法和角度,这次是平均测量值。

  @OutputTimeUnit表示基准结果使用的时间单元,该时间单元可用于类或方法注释,并在Java.util.concurrent.timeunit中使用标准时间单元。

  在主要方法中,您可以通过Runner Class运行选项实例。官方提供了一个optionsbuilder对象de -streaming struction。

  解释:

  第1-10行代表测试的基本信息,例如所使用的Java路径,预热代码的迭代次数,测量代码的迭代次数,所使用的线程数,测试的统计单元。

  第13行的每次预热迭代的结果,预热的迭代将不会用作最终的统计结果。温暖的目的是允许Java虚拟机以优化足够的测试代码。例如,在预热代码之后,应将测试代码完全编译和优化。

  从第18行开始,显示每个基准测试迭代的结果,每次迭代显示当前的执行率,即在操作上花费的时间。

  进行5次迭代后,进行统计信息,结果是结果。结果的第一段告诉我们最大,最小和平均信息。第二段是最重要的信息。在本示例中,第54行和55行显示。从结果可以看出,当大量的字符串缝合类型时,StringBuilder更有效地,可以看到TestStringBuilder和TestStringAdd函数的平均执行时间和错误时间。

  测试模式的方法运行基准测试执行模式的方法多少次是错误的。单位模式表示JMH的测量方法和角度。有4种类型。吞吐量和方法执行的平均时间是最常用的统计方法。可以通过@BenchmarkMode注释配置配置。

  吞吐量:总吞吐量,这意味着可以在1秒内执行多少次调用。如下:

  平均时间:通话的平均时间是指每个呼叫所需的时间,即案例的模式。

  SampleTime:随机采样,最终输出采样结果的分布,例如“ 99%的呼叫在XXX毫秒内,而XXX毫秒内的99.99%呼叫”。如下:

  单打示照:上述模式是默认迭代1秒,仅单打光即可运行一次。热量的数量通常在同一时间设置为0,以测试冷启动时的性能。

  总的来说:顾名思义,所有模式都通常用于内部测试。

  迭代是JMH测量的单位。在大多数测量模式中,它的迭代表示1秒。在第二秒,测量方法不是不间断的,并且吞吐量的吞吐量,平均时间等。

  热身是指基准之前的预热行为。

  为什么您需要热身?由于JVM的JIT机制的存在,如果将功能称为多次,JVM会尝试将其编译为机器代码以提高执行速度。基准更接近现实情况,您需要预热。

  由于JIT的JIT存在,相同的方法将在JIT汇编之前和之后不同。实际上,JIT编译后的方法的性能。使用-XINT参数以关闭JIT优化。

  @State注释,在类上行动。通过状态,您可以指定对象的范围。有三个主要范围:

  在测试开始之前,必须先配置测试。通常需要某些参数,例如指定的测试类(包括),所使用的进程数(fork)和预热迭代的数量。启动配置时,需要使用配置类。

  OptionsBuilder的常见方法和相应的注释如下:如下:

  @outputTimeUnit:基准结果使用的时间单元可用于类或方法注释,并在Java.util.concurrent.timeunit中使用标准时间单元。

  @setup:方法注释,它将在执行基准标准之前执行,就像其名称一样,主要用于初始化。

  @teardown:与@SetUp相对的方法注释将在所有基准执行后将执行,主要用于资源恢复。

  @Param:会员注释可用于指定某个参数的多种情况。它特别适合在不同参数输入下测试函数的性能。@param param注释接收一个字符串阵列,该阵列在之前转换为相应的数据类型执行@setup方法。多个@param注释的成员是乘法关系。例如,有两个字段带有@Param注释。第一个具有5个值,第二个字段具有2个值。然后,每种测试方法将运行5 ** 5*2 = 10次。

  参考资料:

  如果您不理解或不需要交流,可以发出消息。此外,我想喜欢,收集和关注,我将继续更新各种Java学习博客!