java jmh

作者:原创时间:2022-04-02
文档

java jmh是什么,让我们一起了解一下?

JMH是一种Java工具,用于构建、运行和分析用Java和其他针对JVM的语言编写的nano/micro/mili/macro基准测试。JMH一般用于代码的性能调优,精度可以达到纳秒级别,适用于 java以及其他基于JVM的语言。

JMH注解说明:

在运行时,注解配置被用于解析生成BenchmarkListEntry配置类实例。

一个方法对应一个@Benchmark注解,一个@Benchmark注解对应一个基准测试方法。

注释在类上的注解,或者注释在类的字段上的注解,则是类中所有基准测试方法共用的配置。

@Benchmark声明一个public方法为基准测试方法。

@BenchmarkMode通过JMH我们可以轻松的测试出某个接口的吞吐量、平均执行时间等指标的数据(假设我想测试testGson方法的平均耗时,那么可以使用@BenchmarkMode注解指定测试维度为Mode.AverageTime。)

@Measurement测量次数

@Measurement假设我想测量testGson方法五次,那么可以使用@Measurement注解。

@Warmup配置预热参数。

为了数据准确,我们可能需要让testGson方法做下热身运动。如在方法中创建GsonParser对象,预热可以避免首次创建GsonParser时因多了类加载的耗时而导致测试结果不准备的情况。jvm使用JIT即时编译器,一定的预热次数可让JIT对testGson方法的调用链路完成编译,去掉解释执行对测试结果的影响。

@OutputTimeUnit

OutputTimeUnit注解用于指定输出的方法执行耗时的单位。如果方法执行耗时为秒级别,为了便于 观察结果,我们可以使用@OutputTimeUnit指定输出的耗时时间单位为秒;如果方法执行耗时为毫秒级别,为了便于观察结果,我们可以使用@OutputTimeUnit指定输出的耗时时间单位为毫秒,否则使用默认的秒做单位,会输出10的负几次方这样的数字,不太直观。

@Fork用于指定fork出多少个子进程来执行同一基准测试方法。假设我们不需要多个进程,那么 可以使用@Fork指定为进程数为1。

@Threads注解用于指定使用多少个线程来执行基准测试方法,如果使用@Threads指定线程数为2,那么每次测量都会创建两个线程来执行基准测试方法。

具体代码如下:

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

以上就是小编今天的分享了,希望可以帮助到大家。

显示全文
java jndi java joptionpane java jps java jquery java jsonfield java jsonp java jstack java jstat java jta java jtable java jtextfield java jvm java jxl java kafka java keystore java kmeans java kudu java lamada java leveldb java linklist java jmeter java jit java jetty java jep 计算机管理怎么打开 excel怎么排序 两个excel如何独立显示 微信分组怎么删除 朋友圈怎么转发 qq怎么清理缓存和垃圾清理 苹果手机怎么恢复出厂设置 怎么导出微信聊天记录 微信群怎么找 java execute java exchange java event java escape java error java epoll java environment