BenchmarkMode注解,和OutputTimeUnit 注解的学习.
package org.openjdk.jmh.samples;
import org.openjdk.jmh.annotations.Benchmark;
import org.openjdk.jmh.annotations.BenchmarkMode;
import org.openjdk.jmh.annotations.Mode;
import org.openjdk.jmh.annotations.OutputTimeUnit;
import org.openjdk.jmh.runner.Runner;
import org.openjdk.jmh.runner.RunnerException;
import org.openjdk.jmh.runner.options.Options;
import org.openjdk.jmh.runner.options.OptionsBuilder;
import java.util.concurrent.TimeUnit;
public class JMHSample_02_BenchmarkModes {
// jmh 通过选择不同的测试的模式 ,来进行不同的测试, 并且可以在OptionsBuilder.mode() 里面修改来达到override方法上面的BenchmarkMode,这里的BenchmarkMode还可以还可以标注在类上.
@Benchmark
@BenchmarkMode(Mode.Throughput)
@OutputTimeUnit(TimeUnit.SECONDS)
public void measureThroughput() throws InterruptedException {
TimeUnit.MILLISECONDS.sleep(100);
}
// AverageTime 表示测试的是方法的平均运行时间
// OutputTimeUnit 输出时间的单位, 微秒
@Benchmark
@BenchmarkMode(Mode.AverageTime)
@OutputTimeUnit(TimeUnit.MICROSECONDS)
public void measureAvgTime() throws InterruptedException {
TimeUnit.MILLISECONDS.sleep(100);
}
// SampleTime 表示使用随机采样时间, 在有限的时间里面运行, 这将有利于我们获得时间的分布和百分位
@Benchmark
@BenchmarkMode(Mode.SampleTime)
@OutputTimeUnit(TimeUnit.MICROSECONDS)
public void measureSamples() throws InterruptedException {
TimeUnit.MILLISECONDS.sleep(100);
}
// 单次基准测试, 这里指定运行的时间毫无意义. 测试测试一些冷启动测试非常有用,因为这里的
@Benchmark
@BenchmarkMode(Mode.SingleShotTime)
@OutputTimeUnit(TimeUnit.MICROSECONDS)
public void measureSingleShot() throws InterruptedException {
TimeUnit.MILLISECONDS.sleep(100);
}
// 这里的基准测试能够嗲用多种测试, 如下
@Benchmark
@BenchmarkMode({Mode.Throughput, Mode.AverageTime, Mode.SampleTime, Mode.SingleShotTime})
@OutputTimeUnit(TimeUnit.MICROSECONDS)
public void measureMultiple() throws InterruptedException {
TimeUnit.MILLISECONDS.sleep(100);
}
// Moal.all 表示使用所有的基准测试模式来测试
@Benchmark
@BenchmarkMode(Mode.All)
@OutputTimeUnit(TimeUnit.MICROSECONDS)
public void measureAll() throws InterruptedException {
TimeUnit.MILLISECONDS.sleep(100);
}
public static void main(String[] args) throws RunnerException {
Options opt = new OptionsBuilder()
.include(JMHSample_02_BenchmarkModes.class.getSimpleName())
.forks(1)
.build();
new Runner(opt).run();
}
}
总结一下测试基准模式:
- Throughput: 吞吐量测试 计算所有的工作的线程的运行次数,这种模式是基于时间的, 直到iteration 结束, 后面我们会介绍 关于iteration 注解的介绍. 这里的iteration表示循环多少次运行这一个方法.
2 . AverageTime: 平均时间测试, 计算所有工作线程的运行时间, 这个和吞吐量测试是相反的, 但是也是基于时间的, 直到iteration 运行结束. - SampleTime: 随机采样,此模式会自动调整采样频率, 利于获得时间的分布和百分位.
- SingleShotTime: 此模式仅仅会运行一次, 此模式适合测试冷启动的时间,或者记录每一次调用的
- All: 上述所有的测试模式
BenchmarkMode
,OutputTimeUnit
这两个注解不仅可以放在类上,还可以放在方法上, 并且还可以通过OptionsBuilder 来修改他们.
网友评论