JMH使用

作者: 砺豪 | 来源:发表于2017-04-23 18:03 被阅读684次

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

    相关文章

      网友评论

          本文标题:JMH使用

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