在 Java 中如何进行微基准测试 ?

1. jmh 微基准测试

实际上,在 java 中进行微基椎测试并不容易,主要原因在于解释执行编译执行,而编译执行又分为 C1编译, C2编译。即使是对同一个代码来说,不同的 jvm 参数也会导致测试不一样。

那是否应该了解微基准测试? 我的答案,是必须掌握的。

jmh 就是我们应该学习的微基准测试的框架。

下面我以一个示例来说明如何快速上手测试,测试 StringBuilderStringBufferString 连接字符的性能。

注意点:

  • Fork 参数可以测试不同的 Jvm 参数。
  • 输出结果的时间单位最好是纳秒
  • 测试模式可以自由选择,如果测试性能,最好选择平均时间
  • 如果是在 IDE 中,建议安装 jmh 插件来执行。

代码示例

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
// 预热的参数
@Warmup(time = 1)
// 测试的参数
@Measurement(time = 1)
// 可以添加 JVM 参数来测试
@Fork(value = 1)
@State(Scope.Thread)
@OutputTimeUnit(TimeUnit.NANOSECONDS)
@BenchmarkMode(Mode.AverageTime)
public class TestStringBenchmark {

  @Benchmark
  public String stringBuilder() {
    StringBuilder sb = new StringBuilder();
    sb.append("hello");
    sb.append("world");
    return sb.toString();
  }


  @Benchmark
  public String stringBuffer() {
    StringBuffer sb = new StringBuffer();
    sb.append("hello");
    sb.append("world");
    return sb.toString();
  }

  @Benchmark
  public String stringConcat() {
    return "hello" + "world";
  }

}

2. 代码实现位置

github 地址

3. 参考

强烈建议大家看官方代码, 地址: https://github.com/openjdk/jmh

0%