1.JMH的介绍
JMH是新的microbenchmark(微基准测试)框架(2013年首次发布)。与其他众多框架相比它的特色优势在于,它是由Oracle实现JIT的相同人员开发的。特别是我想提一下Aleksey Shipilev和他优秀的博客文章。JMH可能与最新的Oracle JRE同步,其结果可信度很高。
2. 使用JMH
使用JMH仅需满足2个必要条件(其他所有都是建议选项):
- 设置jmh-core的maven依赖
- 使用注解测试方法
2.1 在pom.xml中添加如下内容:
<dependencies>
<!-- https://mvnrepository.com/artifact/org.openjdk.jmh/jmh-core -->
<dependency>
<groupId>org.openjdk.jmh</groupId>
<artifactId>jmh-core</artifactId>
<version>1.15</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.openjdk.jmh/jmh-generator-annprocess -->
<dependency>
<groupId>org.openjdk.jmh</groupId>
<artifactId>jmh-generator-annprocess</artifactId>
<version>1.15</version>
</dependency>
<!-- https://mvnrepository.com/artifact/junit/junit -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
</dependencies>
2.2 安装m2e-apt
在eclipse market中搜索m2e 找到这个:
并安装
2.3 在IDE的preference中勾选自动启动 apt
在eclipse: windows-> preference-> Maven->Annotation Processing中 勾选第一个选项 如图:
3 demo
官方有个jmh的示例 helloworld
http://hg.openjdk.java.net/code-tools/jmh/file/tip/jmh-samples/src/main/java/org/openjdk/jmh/samples/
我再附一个例子,测试两个方法的性能:
package jmh;
import org.openjdk.jmh.annotations.Benchmark;
import org.openjdk.jmh.annotations.BenchmarkMode;
import org.openjdk.jmh.annotations.Mode;
import org.openjdk.jmh.annotations.Scope;
import org.openjdk.jmh.annotations.State;
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;
@State(value = Scope.Benchmark)
public class Test {
private int a[] = new int[5];
@Benchmark
@BenchmarkMode(Mode.SampleTime)
public void badTry() {
int result = 0;
int i = 0;
try {
while (true) {
result += this.a[i++];
}
} catch (ArrayIndexOutOfBoundsException e) {
// do nothing
}
}
@Benchmark
@BenchmarkMode(Mode.SampleTime)
public void goodTry() {
int result = 0;
for (int i = 0; i < a.length; i++) {
result += this.a[i];
}
}
public static void main(String[] args) throws RunnerException {
Options opt = new OptionsBuilder()
.include(Test.class.getSimpleName())
.forks(0)
.build();
new Runner(opt).run();
}
}
需要注意的是,运行jmh main 中就是这样写的,然后在方法上加上注解就可以跑了