健康警告!
这篇文章描述了如何设置和运行简单的JMH基准测试。 众所周知,微基准测试很难正确设置,即使您确实正确设置了(通过使用JMH之类的工具),它们仍然会产生误导。 仅仅因为您的代码在极端孤立的人为情况下以某种方式运行,并不意味着它将在您的生产代码内以相同的方式运行。 仅举几个例子,在实际程序中,CPU缓存将受到代码其他部分的压力,任何对象的创建都会对GC产生下游影响,而JIT可能从您的其他部分内联并编译了代码与您基准测试的代码冲突的代码。 不过,微型基准确实有其地位,如果您打算使用微型基准,那么最好还是与JMH一起正确地执行。
在最近的一篇文章中,我被要求执行我的测试作为JMH性能基准。
JMH是用于构建,运行和分析以Java和其他针对JVM的其他语言编写的nano / micro / milli / macro基准测试的Java工具。 在此处查看完整文档。
JMH之所以如此出色,是因为它负责预热迭代,分派JVM进程,以使基准不会互相干扰,整理结果并以统一的方式呈现。 还有更多。
我听过很多有关JMH的信息,看到过许多JMH的结果,但我自己却从未真正运行过。 太简单了! 这就是我做的。
将这些依赖项添加到您的Maven pom.xml文件中:
<dependency><groupId>org.openjdk.jmh</groupId><artifactId>jmh-core</artifactId><version>1.5.1</version></dependency><dependency><groupId>org.openjdk.jmh</groupId><artifactId>jmh-generator-annprocess</artifactId><version>1.5.1</version>
</dependency>
然后确定要进行基准测试的方法,并向其添加注释@Benchmark。 如果您需要任何初始化代码,请将其添加到应标记为@Setup的方法中。
运行基准测试的最简单方法是通过将该实现添加到您的main方法中来进行添加。 (有关运行测试的其他方法,请参见此处 )。
public static void main(String[] args) throws RunnerException {Options opt = new OptionsBuilder().include(MyBenchmark.class.getSimpleName()).forks(1).build();new Runner(opt).run();
}
然后像运行任何普通程序一样运行,您将获得所有JMH的好处!
作为查看JMH基准格式的示例,我的结果如下所示:
Benchmark Mode Cnt Score Error Units
CompTestBenchmark.bmCustomComparator thrpt 20 2598.617 ± 67.634 ops/s
CompTestBenchmark.bmJDKComparator thrpt 20 751.110 ± 14.835 ops/s
CompTestBenchmark.bmNoVTLComparator thrpt 20 1348.750 ± 30.382 ops/s
CompTestBenchmark.bmNoVTLOrAutoBoxingComparator thrpt 20 2202.995 ± 43.673 ops/s
有大量的花哨的技巧可以微调您的基准,我不会在这里讨论,但希望这能使您正常运行。
- 有关我的测试的完整代码列表,请参见此处 。
翻译自: https://www.javacodegeeks.com/2015/02/jmh-setup-run-jmh-benchmark.html