小编Ser*_*rge的帖子

带有-gc true的Java 12与Java 8上流API的神秘微基准测试结果

作为我研究在流中使用复杂过滤器或多个过滤器之间区别的一部分,我注意到Java 12的性能比Java 8慢。

这些奇怪的结果有什么解释吗?我在这里想念什么吗?

组态:

  • Java 8

    • OpenJDK运行时环境(内部版本1.8.0_181-8u181-b13-2〜deb9u1-b13)
    • OpenJDK 64位服务器VM(内部版本25.181-b13,混合模式)
  • Java 12

    • OpenJDK运行时环境(内部版本12 + 33)
    • OpenJDK 64位服务器VM(内部版本12 + 33,混合模式,共享)
  • VM选项: -XX:+UseG1GC -server -Xmx1024m -Xms1024m

  • CPU:8核

JMH吞吐量结果

  • 预热:10次迭代,每次1秒
  • 测量:10次迭代,每次1秒
  • 线程:1个线程,将同步迭代
  • 单位:ops / s

比较表

流+复杂过滤器

public void complexFilter(ExecutionPlan plan, Blackhole blackhole) {
        long count = plan.getDoubles()
                .stream()
                .filter(d -> d < Math.PI
                        && d > Math.E
                        && d != 3
                        && d != 2)
                .count();

        blackhole.consume(count);
    }
Run Code Online (Sandbox Code Playgroud)

流+多个过滤器

public void multipleFilters(ExecutionPlan plan, Blackhole blackhole) {
        long count = plan.getDoubles()
                .stream() …
Run Code Online (Sandbox Code Playgroud)

java benchmarking java-stream jmh java-12

55
推荐指数
1
解决办法
1732
查看次数

为什么 Jackson Streaming API 很慢?

根据 Jackson Streaming API 文档:

如果您明确重写所有转换以使用 Streaming API 而不是数据绑定,您可能能够将吞吐量提高 30-40%;这对实际生成的 JSON 没有任何更改。

阅读全文:https : //github.com/FasterXML/jackson-docs/wiki/Presentation : -Jackson-Performance

但是,根据我的基准测试,在最佳情况下吞吐量提高了 15-20%,对于写入复杂对象,甚至降低了约 23%。

难道我做错了什么?为什么使用流式 api 的复杂对象的写入操作比使用在流式 api 之上工作的 ObjectMapper 慢?

非常有趣的是,对于 java11/12,Jackson Streaming 的写入性能下降更为显着(约 2% 相比于 Java 11/12 的约 24%)。

配置:

  • 8个CPU
  • 64 GB 内存
  • 操作系统版本 16.04.1 LTS (Xenial Xerus)
  • Docker 版本 18.03.0-ce,构建 0520e24

JMH 吞吐量结果:

  • 预热:10 次迭代,每次 10 秒
  • 测量:10 次迭代,每次 10 秒
  • 线程:1 个线程,将同步迭代
  • 虚拟机选项:-XX:+UseG1GC -server -Xmx4096m -Xms4096m
  • 单位:操作数/秒

复杂对象

大对象 json 对象大小 ~ 52KB

普通对象

小物体 json 对象大小 ~ 72B

结构: …

java jackson jackson-modules jmh java-11

5
推荐指数
0
解决办法
1422
查看次数