前言
最近在看《Java8函数式编程》时,发现了一个性能测试工具 JMH(Java Microbenchmark Harness)。这个工具方便了我们进行微基准测试。比如,在进行微基准测试时,我们想要测试的是“程序被JVM编译成机器代码(而不是直接执行字节码)”的执行速度。为了让JVM把要测试的代码编译成机器码,我们可能需要把要测试的代码进行“预热处理”(就是先跑几回,或十几回等,当运行的次多了,JVM就会生成机器码),JMH就提供“预热处理”等一系列的处理。
正文
一,学习文章:
- JMH - Java Microbenchmark Harness:从零开始的学习JMH的使用。包括“自动创建JMH工程”、“和一些关键字的作用”、“测试时代码的优化方案”等。
- JMH简介:一篇国外关于JMH文章的翻译,这篇文章和上面那篇文章内容有点有类似,但多了一些关于注解CPU的介绍。
- JMH 官方介绍
- JMH Samples
二,要注意的问题
用Maven进行 install
在写完 Benchmark 后,在执行之前,要使用mvn clean install
命令进行生成Jar
包。因为如果不执行这个命令,而直接IDE执行Main函数的话,会出现找不到/META-INF/BenchmarkList
文件的错误。使用 mvn 命令的话,就会生成 BenchmarkList 文件。生成这个文件后,再使用IDE执行就没问题了。在 Intellij IDEA 中执行
当在 Intellij IDEA 中执行的Main函数时,不要使用 Debug 模式执行,要使用 Run 模式执行。如果使用 Debug 模式执行的话,会出现下面的错误:
ERROR: transportFATAL eErRrRoOrR 2i0n2 :n actoinvnee cmte tfhaoidl:e dJ:D WCPo nNno transports ineitcitailoinz erde,f ujsvemd
ERROR: JtDiWEP Transport dt_socket failed tror oirn=iAtGiEaNlTi_zEeRROR_TRANSPORT_INIT,( 1T9R7)
ANSPORT_INIT(510)
JDWP exit error AGENT_ERROR_TRANSPORT_INIT(197): No transports initialized [debugInit.c:750]
<forked VM failed with exit code 134>
<stdout last='20 lines'>
FATAL ERROR in native method: JDWP No transports initialized, jvmtiError=AGENT_ERROR_TRANSPORT_INIT(197)
</stdout>
<stderr last='20 lines'>
ERROR: transport error 202: connect failed: Connection refused
ERROR: JDWP Transport dt_socket failed to initialize, TRANSPORT_INIT(510)
JDWP exit error AGENT_ERROR_TRANSPORT_INIT(197): No transports initialized [debugInit.c:750]
</stderr>
# Run complete. Total time: 00:00:00
Benchmark Mode Cnt Score Error Units