package JMHExp01;
import org.openjdk.jmh.annotations.*;
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.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.concurrent.TimeUnit;
@BenchmarkMode(Mode.AverageTime)
@State(Scope.Thread)
@OutputTimeUnit(TimeUnit.MICROSECONDS)
@Warmup(iterations = 5)
@Measurement(iterations = 5)
public class ArrayListVSLinkedList {
private final String Data=“DATA”;
private List arrayList;
private List LinkedList;
@Setup(Level.Iteration)
public void setUp(){
this.arrayList=new ArrayList<>();
this.LinkedList=new LinkedList<>();
}
@Benchmark
public List<String> arraylistAdd(){
arrayList.add(Data);
return arrayList;
}
@Benchmark
public List<String> linklistAdd(){
LinkedList.add(Data);
return LinkedList;
}
public static void main(String[] args) throws RunnerException {
final Options opts=new OptionsBuilder()
.include(ArrayListVSLinkedList.class.getSimpleName())
.forks(1)
.measurementIterations(10)
.warmupIterations(10).build();
new Runner(opts).run();
}
}
[点击并拖拽以移动]
运行结果如下:
Benchmark Mode Cnt Score Error Units
JMHExp01.ArrayListVSLinkedList.arraylistAdd thrpt 5 67.977 ± 26.910 ops/us
JMHExp01.ArrayListVSLinkedList.linklistAdd thrpt 5 8.024 ± 17.184 ops/us
JMHExp01.ArrayListVSLinkedList.arraylistAdd avgt 5 0.014 ± 0.008 us/op
JMHExp01.ArrayListVSLinkedList.linklistAdd avgt 5 0.128 ± 0.253 us/op
1. 以上就是JMH基准测试例子、JMH注解介绍如下所示
1: @ Benchmark 进行基准测试的方法需要使用@Benchmark进行注解,如果不使用则视为普通方法。
2: @Warmup(iterations = 5) 可以设置全局、也可以在main方法中覆盖,全局会被局部所覆盖,为五则代表预热五次,@Warmup为预热的意思。
3: @Measurement(iterations = 5)可以设置全局、也可以在main方法中覆盖,全局会被局部所覆盖,为五则代表度量五次,@Measurement 代表为度量五次的意思。
4: @BenchmarkMode此注解代表使用哪一种方式进行运行
1:AverageTime Mode.AverageTime 平均响应时间,输出每次基准测试需要的平均响应时间。
2:Throughput Mode.Throughput 方法吞吐量,在单位时间内方法会被调用多少次。
3:SampleTime Mode.SampleTime 时间采样,利用抽样的方式来描述性能数据。
4:SingleShotTime Mode.SingleShotTime 用法和3类似,一般用于冷测试、此时Warmup一般预热次数设置为0,
以上四种可以一起使用,例如@BenchmarkMode({Mode.AverageTime,Mode.Throughput})
5: @OutputTimeUnit(TimeUnit.MICROSECONDS) 统计输出单位,在单位时间内输出多少次,可以设置全局, 也可以设置在方法上
6: @State 对用Scope的三个枚举值
1:Benchmark State(Scope.Benchmark) 某个类被不同线程操控的性能、多个线程操作一个实例的情况。
2:Benchmark State(Scope.Thread) 线程独享(每一个方法的线程都有一个独立的对象实例、例如上 例,ArrayList和LinkedList都是线程不安全的,所以一般用于线程不安全的类)
3:Benchmark State(Scope.Group) 允许多个基准测试方法并发的执行。exp01
package JMHExp01;
import org.openjdk.jmh.annotations.*;
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;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
@BenchmarkMode(Mode.AverageTime)
@Warmup(iterations = 10)
@Measurement(iterations = 10)
@OutputTimeUnit(TimeUnit.MICROSECONDS)
public class Explamlee01 {
@State(Scope.Group)
public static class IntMonitor{
private int x;
private final Lock lock=new ReentrantLock();
public void lockInc(){
lock.lock();
try {
x++;
}finally {
lock.unlock();
}
}
public void synInt(){
synchronized (this){
x++;
}
}
}
@State(Scope.Group)
public static class InterMoticMonitor{
private AtomicInteger a=new AtomicInteger();
public void atoMic(){
a.incrementAndGet();
}
}
@Benchmark
@Group("sync")
@GroupThreads(10)
public void syn(IntMonitor intMonitor){
intMonitor.synInt();
}
@Benchmark
@Group("lock")
@GroupThreads(10)
public void lock(IntMonitor intMonitor){
intMonitor.lockInc();
}
@Benchmark
@Group("Atomic")
@GroupThreads(10)
public void atominDemo(InterMoticMonitor interMoticMonitor){
interMoticMonitor.atoMic();
}
public static void main(String[] args) throws RunnerException {
final Options opts=new OptionsBuilder()
.include(Explamlee01.class.getSimpleName())
.forks(1)
.warmupIterations(10)
.measurementIterations(10)
.build();
new Runner(opts).run();
}
}
[点击并拖拽以移动]