Java使用JMH进行简单的基准测试Benchmark

这里说道的基准测试Benchmark其实是微基准测试Micro-Benchmark。这里面的概念就不详细介绍了,反正就是JMH可以非常方便的帮助我们进行java代码的简单基准测试。

有什么用

可以对多组代码进行基准测试比较。

很多人总说,这样用速度快,性能好,别听他们的,自己试过才知道。

Java的基准测试需要注意的几个点

测试前需要预热。
防止无用代码进入测试方法中。
并发测试。
测试结果呈现。

简单的代码例子

我们来看一个简单的示例,大家就知道JMH的强大了。

测试代码如下。

代码中有好多注解,我们一会再说,先说我们要干什么。这里应该很好看出来,大家都说String进行字符相加的时候没有StringBuilder快,怎么证明,则就是我们要做的事情。

现在来解释注解

@Setup

这次我们没用到,简单说,这个注解的作用就是我们需要在测试之前进行一些准备工作,比如对一些数据的初始化之类的。。

@BenchmarkMode

基准测试类型。这里选择的是Throughput也就是吞吐量。根据源码点进去,每种类型后面都有对应的解释,比较好理解,吞吐量会得到单位时间内可以进行的操作数。

下面看下这里的源码。

@Warmup

上面我们提到了,进行基准测试前需要进行预热。一般我们前几次进行程序测试的时候都会比较慢,所以要让程序进行几轮预热,保证测试的准确性。其中的参数iterations也就非常好理解了,就是预热轮数。

@Measurement

度量,其实就是一些基本的测试参数。iterations进行测试的轮次,time每轮进行的时长,timeUnit时长单位。都是一些基本的参数,可以根据具体情况调整。一般比较重的东西可以进行大量的测试,放到服务器上运行。

@Threads

测试线程,这个非常好理解,根据具体情况选择,一般为cpu乘以2。

@OutputTimeUnit

这个比较简单了,基准测试结果的时间类型。一般选择秒或者毫秒。

@State

当使用@Setup参数的时候,必须在类上加这个参数,不然会提示无法运行。

执行方式

生成jar执行

一般对于大型的测试,需要测试时间比较久,线程比较多的话,就需要去写好了丢到linux程序里执行,不然本机执行很久时间什么都干不了了。

首先编译,然后执行就可以了。当然在执行的时候可以输入-h参数来看帮助。

在IDE中执行

对于一些我们自己的一些小测试,就可以直接在IDE中执行了,还丢到linux上去太麻烦了。怎么搞呢,看下面。

执行的方法当然还是个main方法,当然你用junit也是可以的。这里其实也比较简单,new个Options,然后传入要运行哪个测试,选择基准测试报告输出文件地址,设置fork出的线程数,然后通过Runner的run方法就可以跑起来了。

报告结果

下面我们来看下报告结果。

内容有点多,仔细看,三大部分,第一部分是有序的结果,第二部分是无序的结果,第三部分就是两个的简单结果比较。这里注意我们forks传的2,所以每个测试有两个fork结果。

前两部分是一样的,简单说下。首先会写出每部分的一些参数设置,然后是预热迭代执行(Warmup Iteration),然后是正常的迭代执行(Iteration),最后是结果(Result)。这些看看就好,我们最关注的就是第三部分,其实也就是最终的结论。千万别看歪了,他输出的也确实很不爽,error那列其实没有内容,score的结果是xxx ± xxx,单位是没毫秒多少个操作。可以看到,StringBuilder的速度还确实是要比String进行文字叠加的效率好太多。

最后

到此我们介绍了JMH的一些简单用法。对于别人说的东西,现在jvm优化了很多,哪些还是真的,哪些是已经过时的?只有自己试过了才知道。

官网在这,http://openjdk.java.net/projects/code-tools/jmh/
其他还有很多有趣的例子,http://hg.openjdk.java.net/code-tools/jmh/file/tip/jmh-samples/src/main/java/org/openjdk/jmh/samples/

本文原创于赵伊凡BLOG转载请注明出处。

©原创文章,转载请注明来源: 赵伊凡's Blog
©本文链接地址: Java使用JMH进行简单的基准测试Benchmark

“Java使用JMH进行简单的基准测试Benchmark”的一个回复

发表评论

电子邮件地址不会被公开。 必填项已用*标注