微基准测试
JMH是Java Micro Benchmark Harness的简写,是专门用于代码微基准测试的工具集(toolkit)。JMH是由实现Java虚拟机的团队开发的,因此他们非常清楚开发者所编写的代码在虚拟机中将会如何执行。
由于现代JVM已经变得越来越智能,在Java文件的编译阶段、类的加载阶段,以及运行阶段都可能进行了不同程度的优化,因此开发者编写的代码在运行中未必会像自己所预期的那样具有相同的性能体现,JVM的开发者为了让普通开发者能够了解自己所编写的代码运行的情况,JMH便因此而生。
JMH的官网地址:http://openjdk.java.net/projects/code-tools/jmh/。
用JMH进行微基准测试
JMH的开发者已经为我们提供了对应的解决方案 Maven依赖
<dependency>
<groupId>org.openjdk.jmh</groupId>
<artifactId>jmh-core</artifactId>
<version>1.19</version>
</dependency>
<dependency>
<groupId>org.openjdk.jmh</groupId>
<artifactId>jmh-generator-annprocess</artifactId>
<version>1.19</version>
<scope>provided</scope>
</dependency>
微基准测试代码
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.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.concurrent.TimeUnit;
@BenchmarkMode(Mode.AverageTime)
@OutputTimeUnit(TimeUnit.MICROSECONDS)
@State(Scope.Thread)
public class JMHExample01
{
private final static String DATA = "DUMMY DATA";
private List<String> arrayList;
private List<String> linkedList;
@Setup(Level.Iteration)
public void setUp()
{
this.arrayList = new ArrayList<>();
this.linkedList = new LinkedList<>();
}
@Benchmark
public List<String> arrayListAdd()
{
this.arrayList.add(DATA);
return arrayList;
}
@Benchmark
public List<String> linkedListAdd()
{
this.linkedList.add(DATA);
return this.linkedList;
}
public static void main(String[] args) throws RunnerException
{
final Options opts = new
OptionsBuilder().include(JMHExample01.class.getSimpleName())
.forks(1)
.measurementIterations(10)
.warmupIterations(10)
.build();
new Runner(opts).run();
}
}
##