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学习博客!