最近做lettuce共享连接和jedisPool对比压测用到

网上一堆文章介绍,如下:

JMH官方例子

Introduction to JMH

Java 并发编程笔记:JMH 性能测试框架

Java微基准测试框架JMH

JMH性能测试框架

常数折叠

循环展开

Using annotation processor in IDE

主要关注的参数:

 解释参数解释
 
@BenchmarkMode(Mode.Throughput)
 

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

 

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

 
@Warmup(iterations = 1)
 

Warmup 是指在实际进行 benchmark 前先进行预热的行为。

为什么需要预热?

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

 

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

iterations:预热的次数。
time:每次预热的时间。
timeUnit:时间的单位,默认秒。
batchSize:批处理大小,每次操作调用几次方法。

 
@Threads(100)
 
每个进程中的测试线程,可用于类或者方法上。一般选择为cpu乘以2。如果配置了 Threads.MAX ,代表使用 Runtime.getRuntime().availableProcessors() 个线程。 
@State(Scope.Benchmark)
 

类注解,JMH测试类必须使用@State注解,State定义了一个类实例的生命周期,可以类比Spring Bean的Scope。由于JMH允许多线程同时执行测试,不同的选项含义如:

Scope.Thread:默认的State,每个测试线程分配一个实例;
Scope.Benchmark:所有测试线程共享一个实例,用于测试有状态实例在多线程共享下的性能;
Scope.Group:每个线程组共享一个实例;
@Measurement(iterations = 2, time = 600, timeUnit = TimeUnit.MILLISECONDS)
 
度量,其实就是一些基本的测试参数。

iterations 进行测试的轮次
time 每轮进行的时长
timeUnit 时长单位
都是一些基本的参数,可以根据具体情况调整。一般比较重的东西可以进行大量的测试,放到服务器上运行。

@OutputTimeUnit(TimeUnit.MILLISECONDS)
 
benchmark 结果所使用的时间单位,可用于类或者方法注解,使用java.util.concurrent.TimeUnit中的标准时间单位。 
@Benchmark
方法注解,表示该方法是需要进行 benchmark 的对象。 
public static void main(String[] args) throws RunnerException {
    Options options = new OptionsBuilder()
            .include(LettuceBenchmarkTest.class.getSimpleName())
            .output("log.home_IS_UNDEFINED/lettuceAsync-Throughput.log")
            .forks(2)
            .build();
 new Runner(options).run();
}
 

include(SimpleBenchmark.class.getSimpleName())代表我要测试的是哪个类的方法
exclude("stringConcat")代表测试的时候需要排除stringConcat方法
forks(2)指的是做2轮测试,在一轮测试无法得出最满意的结果时,可以多测几轮以便得出更全面的测试结果,而每一轮都是先预热,再正式计量。
warmupIterations(5)代表先预热5次
measurementIterations(5) 正式运行测试5次

   
   
   

 

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐