美文网首页JMH基准测试入门
JMH 性能测试框架入门学习(2):JMHSample_02_B

JMH 性能测试框架入门学习(2):JMHSample_02_B

作者: 山间草夫 | 来源:发表于2020-11-12 10:12 被阅读0次

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

}

总结一下测试基准模式:

  1. Throughput: 吞吐量测试 计算所有的工作的线程的运行次数,这种模式是基于时间的, 直到iteration 结束, 后面我们会介绍 关于iteration 注解的介绍. 这里的iteration表示循环多少次运行这一个方法.
    2 . AverageTime: 平均时间测试, 计算所有工作线程的运行时间, 这个和吞吐量测试是相反的, 但是也是基于时间的, 直到iteration 运行结束.
  2. SampleTime: 随机采样,此模式会自动调整采样频率, 利于获得时间的分布和百分位.
  3. SingleShotTime: 此模式仅仅会运行一次, 此模式适合测试冷启动的时间,或者记录每一次调用的
  4. All: 上述所有的测试模式

BenchmarkMode ,OutputTimeUnit 这两个注解不仅可以放在类上,还可以放在方法上, 并且还可以通过OptionsBuilder 来修改他们.

相关文章

网友评论

    本文标题:JMH 性能测试框架入门学习(2):JMHSample_02_B

    本文链接:https://www.haomeiwen.com/subject/vspubktx.html