Java下如何做基准测试
你是否经常用这样的代码来度量代码性能:
public static void main(String[] args) {
long t1 = System.nanoTime();
int result = 0;
for (int i = 0; i < 1000 ; i++) {
result +=i;
}
long t2 = System.nanoTime();
System.out.println("Execution time: " + ((t2 - t1) * 1e-9) +
" seconds to compute result = " + result);
}
那么,你应该继续往下看.
基准测试面临的问题
仔细阅读 《健壮的 Java 基准测试》 这篇文章,详细介绍了Java基准测试面临的问题,和需要考虑的方方面面,尽管文章年代久远,但并未过时.
基准测试框架(JMH)
阅读完上面这篇文章后, 我们就来试试 jmh,java下的微基础测试框架.
配置工程
首先你需要新建一个maven工程(在你的工作过程上,建一个maven模块也行),然后以依赖的方式可以访问到你被测试的代码.然后再添加jmh依赖:
<dependency>
<groupId>org.openjdk.jmh</groupId>
<artifactId>jmh-core</artifactId>
<version>1.4.1</version>
</dependency>
<dependency>
<groupId>org.openjdk.jmh</groupId>
<artifactId>jmh-generator-annprocess</artifactId>
<version>1.4.1</version>
<scope>provided</scope>
</dependency>
配置插件:
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.1</version>
<configuration>
<compilerVersion>${javac.target}</compilerVersion>
<source>${javac.target}</source>
<target>${javac.target}</target>
</configuration>
</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>benchmarks</finalName>
<transformers>
<transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<mainClass>org.openjdk.jmh.Main</mainClass>
</transformer>
</transformers>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
maven-shade-plugin 插件的主要作用是将所有的代码依赖打包在一个jar中.
编写测试代码
public class MyBenchmark {
@Benchmark
public void test() {
//被测试方法调用
}
}
执行
- mvn clean package
- java -jar target/benchmarks.jar
得到结果
Result: 108420.575 ±(99.9%) 402.469 ops/s [Average] Statistics: (min, avg, max) = (102205.984, 108420.575, 113070.541), stdev = 1704.079 Confidence interval (99.9%): [108018.106, 108823.044]