Java 11 - 针对Java 8的性能回归?

Gil*_*ili 54 performance microbenchmark java-8 jmh java-11

更新:看到每个方法可能会遇到不同的性能问题,我决定将这个问题分成两个:

  1. Java 11中的空方法明显慢于Java 8
  2. 在Java 11中使用堆栈跟踪的速度明显慢于Java 8

最初的讨论可以在下面找到......


当我遇到一些令人惊讶的数据时,我正在比较我的库在Java 8和11下的性能.这是基准代码:

import org.openjdk.jmh.annotations.Benchmark;
import org.openjdk.jmh.annotations.BenchmarkMode;
import org.openjdk.jmh.annotations.Mode;
import org.openjdk.jmh.annotations.OutputTimeUnit;
import org.openjdk.jmh.infra.Blackhole;

import java.io.PrintWriter;
import java.io.StringWriter;
import java.util.concurrent.TimeUnit;

@BenchmarkMode(Mode.AverageTime)
@OutputTimeUnit(TimeUnit.NANOSECONDS)
public class MyBenchmark
{
    @Benchmark
    public void emptyMethod()
    {
    }

    @Benchmark
    public void throwAndConsumeStacktrace(Blackhole bh)
    {
        try
        {
            throw new IllegalArgumentException("I love benchmarks");
        }
        catch (IllegalArgumentException e)
        {
            StringWriter sw = new StringWriter();
            e.printStackTrace(new PrintWriter(sw));
            bh.consume(sw.toString());
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

运行jmh 1.21,OracleJDK 1.8.0_192返回:

MyBenchmark.emptyMethod                avgt   25      0.363 ±   0.001  ns/op
MyBenchmark.throwAndConsumeStacktrace  avgt   25  21408.072 ± 127.393  ns/op
Run Code Online (Sandbox Code Playgroud)

OracleJDK 11.0.1返回:

Benchmark                              Mode  Cnt      Score      Error  Units
MyBenchmark.emptyMethod                avgt   25      0.759 ±    0.034  ns/op
MyBenchmark.throwAndConsumeStacktrace  avgt   25  47143.168 ± 1346.898  ns/op
Run Code Online (Sandbox Code Playgroud)

OpenJDK 11.0.1返回:

Benchmark                              Mode  Cnt      Score     Error  Units
MyBenchmark.emptyMethod                avgt   25      0.725 ±   0.001  ns/op
MyBenchmark.throwAndConsumeStacktrace  avgt   25  47389.051 ± 994.345  ns/op
Run Code Online (Sandbox Code Playgroud)

当然,绝对差异emptyMethod()是微小的,但趋势似乎跟随更昂贵的操作,如throwAndConsumeStacktrace().另外,Java 11中的其他操作(例如抛出异常并且从不使用堆栈跟踪)只是速度稍慢,因此性能下降并不适用于所有操作.

我知道微基准测试并不表示现实应用程序的性能行为.不过,我很好奇这种差异来自哪里.有任何想法吗?

这是我使用的JDK的完整版本信息:

OracleJDK 8:

java version "1.8.0_192"
Java(TM) SE Runtime Environment (build 1.8.0_192-b12)
Java HotSpot(TM) 64-Bit Server VM (build 25.192-b12, mixed mode)
Run Code Online (Sandbox Code Playgroud)

OracleJDK 11.0.1:

java version "11.0.1" 2018-10-16 LTS
Java(TM) SE Runtime Environment 18.9 (build 11.0.1+13-LTS)
Java HotSpot(TM) 64-Bit Server VM 18.9 (build 11.0.1+13-LTS, mixed mode)
Run Code Online (Sandbox Code Playgroud)

OpenJDK 11.0.1:

openjdk version "11.0.1" 2018-10-16
OpenJDK Runtime Environment 18.9 (build 11.0.1+13)
OpenJDK 64-Bit Server VM 18.9 (build 11.0.1+13, mixed mode)
Run Code Online (Sandbox Code Playgroud)

归档时间:

查看次数:

3695 次

最近记录:

6 年,9 月 前