热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Java11相对于Java8,OptaPlanner性能提升有多大?

本文通过基准测试比较了Java11和Java8对OptaPlanner的性能提升。测试结果表明,在相同的硬件环境下,Java11相对于Java8在垃圾回收方面表现更好,从而提升了OptaPlanner的性能。

go比java快多少

尽管大多数开发人员仍然使用Java 8 ,但Java 11还是在不久前发布的。 让我们看看其中哪个对OptaPlanner更快。 找出答案的最佳方法当然是运行OptaPlanner基准测试。 本文是我们针对Java 8的类似文章的后续文章 。

基准方法

为了运行基准测试,我们使用了:

  • 运行RHEL 6,运行2 x Intel® Xeon® CPU E5-2609 0 @ 2.4 GHz (8 cores total)31.3 GiB RAM内存的稳定机器,无需运行任何其他计算要求高的进程。
  • 两种Java版本的G1和Parallel GC都比较了垃圾回收的影响。 Java分别使用-Xmx1536M -server -XX:+UseG1GC-Xmx1536M -server -XX:+UseParallelGC
  • 两种Oracle Java 8:

java version "1.8.0_191"
Java(TM) SE Runtime Environment (build 1.8.0_191-b12)
Java HotSpot(TM) 64-Bit Server VM (build 25.191-b12, mixed mode)

和OpenJDK 11:

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)

  • OptaPlanner 7.14.0.Final
  • 解决计划问题不涉及任何IO (启动期间要加载输入的几毫秒除外)。 一个CPU完全饱和。 它会不断创建许多短命的对象,然后GC会收集它们。
  • 每次运行都可以使用OptaPlanner解决11个计划问题。 每个计划问题将运行5分钟,并以30秒的JVM预热开始,该预热将被丢弃。
  • 基准衡量每毫秒计算的分数数。 越高越好。 为提议的规划解决方案计算分数并非易事:涉及许多计算,包括检查每个实体与每个其他实体之间的冲突。

执行摘要

使用Java 11,G1的平均改进为16.1 % ,并行GC的平均改进为4.5% 。 尽管并行GC面向吞吐量,而G1则侧重于低延迟垃圾回收,但是Java 11中G1的重大改进导致直接比较了这两种垃圾回收算法 。 有关各种GC算法之间差异的更多信息,请参见本文 。

这表明并行GC仍然是OptaPlanner的首选GC,因为吞吐量对于解决OptaPlanner的优化问题比由GC引入的延迟更为重要。

结果

Java 8和Java 11

云平衡 机器重新分配 课程安排 考试安排 护士名册 巡回赛
JDK 200度 800c B1 B10 c7 c8 s2 s3 m1 1小时 14天
Java 8 38,074 34,870 113,490 20,398 4,296 4,840 7,003 5,437 2,385 2,021 812
OpenJDK 11 41,753 41,282 166,676 20,363 4,473 5,466 8,157 5,927 2,772 2,536 957年
区别 9.7% 18.4% 46.9% -0.2% 4.1% 12.9% 16.5% 9.0% 16.2% 25.5% 17.9%
平均 16.1%

使用G1垃圾收集器,几乎所有数据集在Java 11上都优于Java 8。 平均而言,仅切换到Java 11即可实现16%的改进。对此改进的可能解释可能是Java 10中引入的JEP 307:用于G1的并行完整GC 。

云平衡 机器重新分配 课程安排 考试安排 护士名册 巡回赛
JDK 200度 800c B1 B10 c7 c8 s2 s3 m1 1小时 14天
Java 8 54,990 52,514 122,611 13,382 4,821 5,880 8,775 6,170 3,234 2,682 880
OpenJDK 11 54,316 50,120 140,816 11,129 4,927 6,071 8,996 6,383 3,336 3,087 1,125
区别 -1.2% -4.6% 14.8% -16.8% 2.2% 3.2% 2.5% 3.5% 3.2% 15.1% 27.8%
平均 4.5%

使用并行垃圾收集器,结果的确定性不及G1。 有些数据集有所改进,而另一些数据集则保持不变,甚至表现出性能下降。 但是,平均而言,Java 11的性能要高出4%以上。

Java 11上的并行GC与G1 GC

云平衡 机器重新分配 课程安排 考试安排 护士名册 巡回赛
Java 11 200度 800c B1 B10 c7 c8 s2 s3 m1 1小时 14天
OpenJDK 11并行GC 54,316 50,120 140,816 11,129 4,927 6,071 8,996 6,383 3,336 3,087 1,125
OpenJDK 11 G1 GC 41,753 41,282 166,676 20,363 4,473 5,466 8,157 5,927 2,772 2,536 957年
区别 -23.1% -17.6% 18.4% 83.0% -9.2% -10.0% -9.3% -7.1% -16.9% -17.8% -14.9%
平均 -2.3%

尽管与并行GC相比,G1 GC在Java 8方面显示出明显的改进,但对于大多数数据集而言,OptaPlanner的GC策略效益较低。 唯一的例外是机器重新分配,这表明G1 OptaPlanner能够更快地计算分数计算83%。 这也适用于Java 8,如使用G1 GC的“分数计算每秒计数”所示。

结论

Java 11带来了其他改进,这些改进在不同的OptaPlanner示例和数据集之间有所不同。 平均而言,使用并行GC的速度要快4.5%,使用G1 GC的速度要快16.1%。 尽管G1 GC有了显着改进,但在此基准测试中,大多数数据集的并行GC仍然更快。

翻译自: https://www.javacodegeeks.com/2019/01/how-much-faster-is-java-11.html

go比java快多少



推荐阅读
  • 深入解析JVM垃圾收集器
    本文基于《深入理解Java虚拟机:JVM高级特性与最佳实践》第二版,详细探讨了JVM中不同类型的垃圾收集器及其工作原理。通过介绍各种垃圾收集器的特性和应用场景,帮助读者更好地理解和优化JVM内存管理。 ... [详细]
  • Explore how Matterverse is redefining the metaverse experience, creating immersive and meaningful virtual environments that foster genuine connections and economic opportunities. ... [详细]
  • 本文将介绍如何编写一些有趣的VBScript脚本,这些脚本可以在朋友之间进行无害的恶作剧。通过简单的代码示例,帮助您了解VBScript的基本语法和功能。 ... [详细]
  • 本文详细介绍了如何在Linux系统上安装和配置Smokeping,以实现对网络链路质量的实时监控。通过详细的步骤和必要的依赖包安装,确保用户能够顺利完成部署并优化其网络性能监控。 ... [详细]
  • 本文详细探讨了Java中的24种设计模式及其应用,并介绍了七大面向对象设计原则。通过创建型、结构型和行为型模式的分类,帮助开发者更好地理解和应用这些模式,提升代码质量和可维护性。 ... [详细]
  • DNN Community 和 Professional 版本的主要差异
    本文详细解析了 DotNetNuke (DNN) 的两种主要版本:Community 和 Professional。通过对比两者的功能和附加组件,帮助用户选择最适合其需求的版本。 ... [详细]
  • Docker的安全基准
    nsitionalENhttp:www.w3.orgTRxhtml1DTDxhtml1-transitional.dtd ... [详细]
  • 本文将介绍如何使用 Go 语言编写和运行一个简单的“Hello, World!”程序。内容涵盖开发环境配置、代码结构解析及执行步骤。 ... [详细]
  • 本文基于刘洪波老师的《英文词根词缀精讲》,深入探讨了多个重要词根词缀的起源及其相关词汇,帮助读者更好地理解和记忆英语单词。 ... [详细]
  • 本文详细介绍了 Dockerfile 的编写方法及其在网络配置中的应用,涵盖基础指令、镜像构建与发布流程,并深入探讨了 Docker 的默认网络、容器互联及自定义网络的实现。 ... [详细]
  • 深入理解Java中的volatile、内存屏障与CPU指令
    本文详细探讨了Java中volatile关键字的作用机制,以及其与内存屏障和CPU指令之间的关系。通过具体示例和专业解析,帮助读者更好地理解多线程编程中的同步问题。 ... [详细]
  • UNP 第9章:主机名与地址转换
    本章探讨了用于在主机名和数值地址之间进行转换的函数,如gethostbyname和gethostbyaddr。此外,还介绍了getservbyname和getservbyport函数,用于在服务器名和端口号之间进行转换。 ... [详细]
  • 本文介绍如何通过Windows批处理脚本定期检查并重启Java应用程序,确保其持续稳定运行。脚本每30分钟检查一次,并在需要时重启Java程序。同时,它会将任务结果发送到Redis。 ... [详细]
  • 作为一名新手,您可能会在初次尝试使用Eclipse进行Struts开发时遇到一些挑战。本文将为您提供详细的指导和解决方案,帮助您克服常见的配置和操作难题。 ... [详细]
  • MongoDB集群配置:副本集与分片详解
    本文详细介绍了如何在MongoDB中配置副本集(Replica Sets)和分片(Sharding),并提供了具体的步骤和命令,帮助读者理解并实现高可用性和水平扩展的MongoDB集群。 ... [详细]
author-avatar
zerosmall
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有