• Micro Benchmark Framework java 基准测试类库


    Micro Benchmark Framework 框架主要是method 层面上的 benchmark,精度可以精确到微秒级
    比较典型的使用场景还有:

    • 想定量地知道某个函数需要执行多长时间,以及执行时间和输入 n 的相关性
    • 一个函数有两种不同实现,不知道哪种实现性能更好

    简单demo

    • 创建项目
     
    mvn archetype:generate 
              -DinteractiveMode=false 
              -DarchetypeGroupId=org.openjdk.jmh 
              -DarchetypeArtifactId=jmh-java-benchmark-archetype 
              -DgroupId=com.dalong 
              -DartifactId=demo-jmh 
              -Dversion=1.0
    • pom 文件
     <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
        <groupId>com.dalong</groupId>
        <artifactId>mybenchmark</artifactId>
        <version>1.0-SNAPSHOT</version>
        <properties>
            <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
            <uberjar.name>benchmarks</uberjar.name>
        </properties>
       <dependencies>
           <dependency>
               <groupId>org.openjdk.jmh</groupId>
               <artifactId>jmh-core</artifactId>
               <version>1.17.2</version>
           </dependency>
           <dependency>
               <groupId>org.openjdk.jmh</groupId>
               <artifactId>jmh-generator-annprocess</artifactId>
               <version>1.17.2</version>
               <scope>provided</scope>
           </dependency>
       </dependencies>
        <build>
            <plugins>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-compiler-plugin</artifactId>
                    <version>3.1</version>
                </plugin>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-shade-plugin</artifactId>
                    <version>2.2</version>
                    <executions>
                        <execution>
                            <phase>package</phase>
                            <goals>
                                <goal>shade</goal>
                            </goals>
                            <configuration>
                                <finalName>${uberjar.name}</finalName>
                                <transformers>
                                    <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                                        <mainClass>org.openjdk.jmh.Main</mainClass>
                                    </transformer>
                                </transformers>
                                <filters>
                                    <filter>
                                        <artifact>*:*</artifact>
                                        <excludes>
                                            <exclude>META-INF/*.SF</exclude>
                                            <exclude>META-INF/*.DSA</exclude>
                                            <exclude>META-INF/*.RSA</exclude>
                                        </excludes>
                                    </filter>
                                </filters>
                            </configuration>
                        </execution>
                    </executions>
                </plugin>
            </plugins>
            <pluginManagement>
                <plugins>
                    <plugin>
                        <artifactId>maven-clean-plugin</artifactId>
                        <version>2.5</version>
                    </plugin>
                    <plugin>
                        <artifactId>maven-deploy-plugin</artifactId>
                        <version>2.8.1</version>
                    </plugin>
                    <plugin>
                        <artifactId>maven-install-plugin</artifactId>
                        <version>2.5.1</version>
                    </plugin>
                    <plugin>
                        <artifactId>maven-jar-plugin</artifactId>
                        <version>2.4</version>
                    </plugin>
                    <plugin>
                        <artifactId>maven-resources-plugin</artifactId>
                        <version>2.6</version>
                    </plugin>
                    <plugin>
                        <artifactId>maven-site-plugin</artifactId>
                        <version>3.3</version>
                    </plugin>
                    <plugin>
                        <artifactId>maven-surefire-plugin</artifactId>
                        <version>2.17</version>
                    </plugin>
                </plugins>
            </pluginManagement>
        </build>
    </project>
       
    • 简单基准测试代码
    package com.dalong;
    import org.openjdk.jmh.annotations.*;
    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;
    import static java.util.concurrent.TimeUnit.MICROSECONDS;
    @BenchmarkMode(Mode.AverageTime)
    @OutputTimeUnit(MICROSECONDS)
    @State(Scope.Thread)
    public class FirstBenchmark {
        @Benchmark
        public int sleepAWhile() {
            try {
                Thread.sleep(500);
            } catch (InterruptedException e) {
                // ignore
            }
            return 0;
        }
        @Benchmark
        public void testMethod() {
            int a = 1;
            int b = 2;
            int sum = a + b;
        }
        public static void main(String[] args) throws RunnerException {
            Options opt = new OptionsBuilder()
                    .include(FirstBenchmark.class.getSimpleName())
                    .forks(1)
                    .warmupIterations(5)
                    .measurementIterations(5)
                    .build();
            new Runner(opt).run();
        }
    }

    运行&&效果

    • 构建
    mvn clean package
    • 运行
    java -jar target/benchmarks.jar

    效果

    几个参考资料

    http://blog.dyngr.com/blog/2016/10/29/introduction-of-jmh/ 简单介绍的
    http://tutorials.jenkov.com/java-performance/jmh.html 很不错的文章

  • 相关阅读:
    转:C++中Static作用和使用方法
    转:C/C++中,空数组、空类、类中空数组的解析及其作用
    转:c++类实例在内存中的分配
    转:union 联合体(共用体)
    转:内存对齐与补齐 字节对齐与结构体大小
    转:c++内存分配
    转:代码重构
    转:设计模式六大原则(3):依赖倒置原则
    读书
    转:Teach Yourself Programming in Ten Years——用十年教会自己编程
  • 原文地址:https://www.cnblogs.com/rongfengliang/p/11341043.html
Copyright © 2020-2023  润新知