文档章节

BenchMark工具-JMH介绍

robin-yao
 robin-yao
发布于 2015/04/29 20:48
字数 726
阅读 1486
收藏 41

    JMH是有OpenJDK开发的基准测试(Benchmark)工具。JMH可以为写基准测试和运行测试提供很好的支持。JMH在Concurrent Benchmarks也提供很好的支持,可以说是多功能测试工具。JMH在2013被公布出来,现在最新版本到1.9。

    JMH基本用法:

       JMH环境构建

      1 使用maven工程,直接在项目中引入相应的jar包

    

<dependency>
    <groupId>org.openjdk.jmh</groupId>
    <artifactId>jmh-core</artifactId>
    <version>${jmh.version}</version>
</dependency>
<dependency>
    <groupId>org.openjdk.jmh</groupId>
    <artifactId>jmh-generator-annprocess</artifactId>
    <version>${jmh.version}</version>
    <scope>provided</scope>
</dependency>

   2 或者直接用JMH的archetype创建:

           mvn archetype:generate \
          -DinteractiveMode=false \
          -DarchetypeGroupId=org.openjdk.jmh \
          -DarchetypeArtifactId=jmh-java-benchmark-archetype \
          -DgroupId=com.yao \
          -DartifactId=jmh-demo \
          -Dversion=1.0

  环境搭建好之后然后就可以写相应的测试用例了

  Demo如下

public class JMHSample_01_HelloWorld {
    @Benchmark
    public void wellHelloThere() {
        // this method was intentionally left blank.
    }
    /*
  
     * a) Via command-line:
     *    $ mvn clean install
     *    $ java -jar target/benchmarks.jar JMHSample_01
     *
     * JMH generates self-contained JARs, bundling JMH together with it.
     * The runtime options for the JMH are available with "-h":
     *    $ java -jar target/benchmarks.jar -h
     *
     * b) Via the Java API:
     *    (see the JMH homepage for possible caveats when running from IDE:
     *      http://openjdk.java.net/projects/code-tools/jmh/)
     */

    public static void main(String[] args) throws RunnerException {
        Options opt = new OptionsBuilder()
                .include(JMHSample_01_HelloWorld.class.getSimpleName())
                .forks(1)
                .build();
        new Runner(opt).run();
    }

运行上面的Demo有两种方法:一个是直接打包,然后会在target中生成benchmarks.jar,里面带有main方法,就直接可以运行:java -jar target/benchmarks.jar。运行后的结果如下格式:(运行的结果也写入指定的文件)

Result "wellHelloThere":

  3142305096.924 ±(99.9%) 17949665.603 ops/s [Average]
    (min, avg, max) = (2907217981.526, 3142305096.924, 3226536099.659), stdev = 76000008.112
      CI (99.9%): [3124355431.320, 3160254762.527] (assumes normal distribution)


# Run complete. Total time: 00:06:42
  Benchmark                Mode  Cnt           Score          Error  Units
  MyBenchmark.testMethod  thrpt  200  3142305096.924 ± 17949665.603  ops/s

同时也支持在IDE中直接运行。

往往在写用例的时候,可以不写main方法,直接在方法上写个Junit的Test注解 ,功能和main相同。

比如netty5中为所有的benchmarks写了一个基类如下:

@Warmup(iterations = AbstractMicrobenchmark.DEFAULT_WARMUP_ITERATIONS)
@Measurement(iterations = AbstractMicrobenchmark.DEFAULT_MEASURE_ITERATIONS)
@Fork(AbstractMicrobenchmark.DEFAULT_FORKS)
@State(Scope.Thread)
public class AbstractMicrobenchmark {

    protected static final int DEFAULT_WARMUP_ITERATIONS = 10;
    protected static final int DEFAULT_MEASURE_ITERATIONS = 10;
    protected static final int DEFAULT_FORKS = 2;

    public static final class HarnessExecutor extends ThreadPoolExecutor {
        public HarnessExecutor(int maxThreads, String prefix) {
            super(0, maxThreads, 1L, TimeUnit.DAYS, new SynchronousQueue<Runnable>(),
                  new DefaultThreadFactory(prefix));
            System.out.println("Using harness executor");
        }
    }

    protected static final String[] JVM_ARGS = {
        "-server", "-dsa", "-da", "-ea:io.netty...", "-Xms768m", "-Xmx768m",
        "-XX:MaxDirectMemorySize=768m", "-XX:+AggressiveOpts", "-XX:+UseBiasedLocking",
        "-XX:+UseFastAccessorMethods", "-XX:+UseStringCache", "-XX:+OptimizeStringConcat",
        "-XX:+HeapDumpOnOutOfMemoryError", "-Dio.netty.noResourceLeakDetection",
        "-Dharness.executor=CUSTOM",
        "-Dharness.executor.class=io.netty.microbench.util.AbstractMicrobenchmark$HarnessExecutor"
    };

    static {
        ResourceLeakDetector.setLevel(ResourceLeakDetector.Level.DISABLED);
    }

    @Test
    public void run() throws Exception {
        String className = getClass().getSimpleName();

        ChainedOptionsBuilder runnerOptions = new OptionsBuilder()
            .include(".*" + className + ".*")
            .jvmArgs(JVM_ARGS);

        if (getWarmupIterations() > 0) {
            runnerOptions.warmupIterations(getWarmupIterations());
        }

        if (getMeasureIterations() > 0) {
            runnerOptions.measurementIterations(getMeasureIterations());
        }

        if (getForks() > 0) {
            runnerOptions.forks(getForks());
        }

        if (getReportDir() != null) {
            String filePath = getReportDir() + className + ".json";
            File file = new File(filePath);
            if (file.exists()) {
                file.delete();
            } else {
                file.getParentFile().mkdirs();
                file.createNewFile();
            }

            runnerOptions.resultFormat(ResultFormatType.JSON);
            runnerOptions.result(filePath);
        }

        new Runner(runnerOptions.build()).run();
    }

    protected int getWarmupIterations() {
        return SystemPropertyUtil.getInt("warmupIterations", -1);
    }

    protected int getMeasureIterations() {
        return SystemPropertyUtil.getInt("measureIterations", -1);
    }

    protected int getForks() {
        return SystemPropertyUtil.getInt("forks", -1);
    }

    protected String getReportDir() {
        return SystemPropertyUtil.get("perfReportDir");
    }
}

    

    我这里仅仅是入门性的介绍,具体的参数和用法本人也不是很熟悉。

具体介绍和用法参照:http://openjdk.java.net/projects/code-tools/jmh/

本人通过官网摘抄的例子,传到github上了:https://github.com/WangErXiao/jmh-demo

END-----------------------------------------------------------------------------------------

转发标注来源:http://my.oschina.net/robinyao/blog/408285

© 著作权归作者所有

共有 人打赏支持
下一篇: Netty ByteBuf详解
robin-yao
粉丝 157
博文 53
码字总数 60598
作品 0
杭州
私信 提问
如何度量你的程序的性能

Java下如何做基准测试 你是否经常用这样的代码来度量代码性能: 那么,你应该继续往下看. 基准测试面临的问题 仔细阅读 《健壮的 Java 基准测试》 这篇文章,详细介绍了Java基准测试面临的问题,...

彗星麦田圈
2016/12/23
12
0
优化技巧:提前if判断帮助CPU分支预测

分支预测 在stackoverflow上有一个非常有名的问题:为什么处理有序数组要比非有序数组快?,可见分支预测对代码运行效率有非常大的影响。 现代CPU都支持分支预测(branch prediction)和指令流...

中间件小哥
06/01
0
0
Java 虚拟机 OpenJ9 和 Hotspot 的 Benchmark 测试

IBM 开源了它开发的 J9 Java 虚拟机 (JVM),并将其贡献给了 Eclipse 基金会,重命名为 Eclipse OpenJ9。J9 是一个高性能可伸缩的 Java 虚拟机,是许多 IBM 企业级软件产品的核心,OpenJ9 可作...

局长
2017/09/19
2.7K
21
阿里程序员工作小技巧 | 理解CPU分支预测,提高代码效率

技术传播的价值,不仅仅体现在通过商业化产品和开源项目来缩短我们构建应用的路径,加速业务的上线速率,也会体现在优秀程序员在工作效率提升、产品性能优化和用户体验改善等小技巧方面的分享...

中间件小哥
11/12
0
0
JMH 的使用及示例

1.JMH的介绍 JMH是新的microbenchmark(微基准测试)框架(2013年首次发布)。与其他众多框架相比它的特色优势在于,它是由Oracle实现JIT的相同人员开发的。特别是我想提一下Aleksey Shipile...

KongFanhao
2016/10/09
410
0

没有更多内容

加载失败,请刷新页面

加载更多

微信小程序 用canvas绘制的图插入到分享中

用canvas绘制图 createNewImg: function () {var that = this;var ctx = wx.createCanvasContext('mycanvas');ctx.setFillStyle("#F4F4F4");// context.setFillStyle("#fff")ctx.fillRe......

潇潇程序缘
11分钟前
0
0
公司报表数据库优化

报表系统优化 背景: 11.22早晨 刚放下背包,收到一份邮件,邮件意思是公司报表数据库慢,让我帮忙看看。邮件还附带了一个SQL文本,指出这个SQL慢。随后电话了开发人员了解事情来龙去脉,原来...

hnairdb
11分钟前
1
0
javascript代码技巧

1、var gt = window.showgt || (windows.showgt="abc");

gtandsn
15分钟前
0
0
TiDB EcoSystem Tools 原理解读(一):TiDB-Binlog 架构演进与实现原理

简介 TiDB-Binlog 组件用于收集 TiDB 的 binlog,并提供实时备份和同步功能。该组件在功能上类似于 MySQL 的主从复制,MySQL 的主从复制依赖于记录的 binlog 文件,TiDB-Binlog 组件也是如此...

TiDB
31分钟前
1
0
Confluence 6 文档主题合并问答

在 Confluence 官方 前期发布的消息 中,文档主题在 Confluence 6.0 及其后续版本中已经不可用。我们知道你可能对这个有很多好好奇的问题,因此我们在这里设置了一个问答用于帮助你将这个主题...

honeymose
34分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部