JMH使用

JMH

<dependency>
    <groupId>org.openjdk.jmh</groupId>
    <artifactId>jmh-core</artifactId>
    <version>1.18</version>
    <scope>test</scope>
</dependency>
<dependency>
    <groupId>org.openjdk.jmh</groupId>
    <artifactId>jmh-generator-annprocess</artifactId>
    <version>1.18</version>
    <scope>test</scope>
</dependency>

State

@State(Scope.Benchmark)
声明类实例是线程共享的,且所有线程共享一个实例
@State(Scope.Thread)
声明类实例是非线程共享的,且所有线程都实例话一个对象

Step

耗时不会计算在总时间里
Setup 和Junit中的Before类似

Level 说明
Level.Trial 默认,全部Benchmark之前
Level.Iteration 一组调用之前
Level.Invocation 每个方法调用之前

TearDown 和Junit中的@After类似

Fork

设置进程数,以及jvm启动参数

Threads

设置线程数,注意和State配合使用


@State(Scope.Benchmark)
@Fork(value = 1,
    jvmArgsAppend = {"-server", "-Xms4g", "-Xmx4g", "-Xmn1536m", "-XX:CMSInitiatingOccupancyFraction=82", "-Xss256k",
                     "-XX:+DisableExplicitGC", "-XX:+UseConcMarkSweepGC", "-XX:+CMSParallelRemarkEnabled",
                     "-XX:LargePageSizeInBytes=128m", "-XX:+UseFastAccessorMethods",
                     "-XX:+UseCMSInitiatingOccupancyOnly", "-XX:+CMSClassUnloadingEnabled"})
@Threads(value = 1)
@BenchmarkMode({Mode.Throughput, Mode.AverageTime})
// time = 5,timeUnit = TimeUnit.SECONDS 意思是每个迭代测量的时间限制在5s
@Measurement(iterations = 3, time = 100, timeUnit = TimeUnit.SECONDS)
@Warmup(iterations = 1, time = 100, timeUnit = TimeUnit.SECONDS)
@OutputTimeUnit(TimeUnit.SECONDS)
public class AopAliLogTest {

    private HelloService helloService;
    private CommonService commonService;

    // 其实也可以放在static中。
    // 不过指明 @Setup 不会计算在总时间里
    @Setup(Level.Trial)
    public void init() {
        ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("application.xml");
        helloService = ctx.getBean(HelloService.class);
        commonService = ctx.getBean(CommonService.class);
    }

    @Benchmark
    public void testAliLogCreateOrder() {
        String result = helloService.createOrder("arg1", "arg2");
        Assert.isTrue("arg1 arg2".equals(result));
    }

    @Benchmark
    public void testCommonCreateOrder() {
        String result = commonService.createOrder("arg1", "arg2");
        Assert.isTrue("arg1 arg2".equals(result));

    }

    // 可以选择安装idea的插件启动,也可以用main函数启动,还可以打包测试
    public static void main(String[] args) throws Exception {
        Options opt = new OptionsBuilder()
            .include(AopAliLogTest.class.getSimpleName())
            .build();
        new Runner(opt).run();
    }
}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容