JAVA高并发之JMH使用

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();
}

}

[点击并拖拽以移动]

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值