压力测试:JMH基础介绍

481 阅读3分钟

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

JMH官方例子

Introduction to JMH

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

Java微基准测试框架JMH

JMH性能测试框架

常数折叠

循环展开

Using annotation processor in IDE

主要关注的参数:

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

 

| ```
 

@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)

 

| ```
@Measurement(iterations = 2, time = 600, timeUnit = TimeUnit.MILLISECONDS)

 

| ```
@OutputTimeUnit(TimeUnit.MILLISECONDS)

 

| ```
@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次                          |
|                                                                                                                                                                                                                                                                                                                                        |                                                                                                                                        |                                                                                                                                                                                                                                                                                     |
|                                                                                                                                                                                                                                                                                                                                        |                                                                                                                                        |                                                                                                                                                                                                                                                                                     |
|                                                                                                                                                                                                                                                                                                                                        |                                                                                                                                        |                                                                                                                                                                                                                                                                                     |

例子:[lettuce 共享连接](https://docs.snowballfinance.com/pages/viewpage.action?pageId=71152516) <https://singgel.blog.csdn.net/article/details/105583251>