一、什么是jmh
JMH是OpenJDK提供的基准测试工具,是由Oracle实现JIT的相同人员开发的。
如:
想准确的知道某个方法需要执行多长时间,以及执行时间和输入之间的相关性;
对比接口不同实现在给定条件下的吞吐量,找到最优实现;
查看多少百分比的请求在多长时间内完成;
<!--jmh-->
<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>
</dependency>
package com.xxxx.checkandbigdataquery.jmh;
import org.openjdk.jmh.annotations.Benchmark;
import org.openjdk.jmh.annotations.Param;
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(Scope.Benchmark)
public class ParamTest {
@Param({"1", "2", "3"})
int testNum;
@Benchmark
public String test() {
return String.valueOf(testNum);
}
public static void main(String[] args) throws RunnerException {
Options opt = new OptionsBuilder()
.include(ParamTest.class.getSimpleName())
.forks(1)
.build();
new Runner(opt).run();
}
}
package com.xxxx.checkandbigdataquery.jmh;
import org.openjdk.jmh.annotations.Mode;
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;
/**
*/
public class StringBuilderRunner {
public static void main( String[] args ) throws RunnerException {
Options opt = new OptionsBuilder()
// 导入要测试的类
.include(StringConnectBenchmark.class.getSimpleName())
// 预热5轮
.warmupIterations(5)
// 度量10轮
.measurementIterations(10)
.mode(Mode.Throughput)
.forks(3)
.build();
new Runner(opt).run();
}
}
package com.xxxx.checkandbigdataquery.jmh;
import org.openjdk.jmh.annotations.Benchmark;
/**
*/
public class StringConnectBenchmark {
/**
* 字符串拼接之 StringBuilder 基准测试
*/
@Benchmark
public void testStringBuilder() {
print(new StringBuilder().append(1).append(2).append(3).toString());
}
/**
* 字符串拼接之直接相加基准测试
*/
@Benchmark
public void testStringAdd() {
print(new String()+ 1 + 2 + 3);
}
/**
* 字符串拼接之String Concat基准测试
*/
@Benchmark
public void testStringConcat() {
print(new String().concat("1").concat("2").concat("3"));
}
/**
* 字符串拼接之 StringBuffer 基准测试
*/
@Benchmark
public void testStringBuffer() {
print(new StringBuffer().append(1).append(2).append(3).toString());
}
/**
* 字符串拼接之 StringFormat 基准测试
*/
@Benchmark
public void testStringFormat(){
print(String.format("%s%s%s", 1, 2, 3));
}
public void print(String str) {
}
}