点击上方蓝色“方志朋”,选择“设为星标”

回复“666”获取独家整理的学习资料!

前言

Java微服务能像Go微服务一样快吗?这是我最近一直在思索地一个问题。

去年8月份的the Oracle Groundbreakers Tour 2020 LATAM大会上,Mark Nelson和Peter Nagy就对此做过一系列基础的的测试用以比较。接下来就给大家介绍下。

以下内容与观点主要源自:https://medium.com/helidon/can-java-microservices-be-as-fast-as-go-5ceb9a45d673

在程序员圈子里,普遍的看法是Java老、慢、无聊 ,而Go是快、新、酷

为了尽可能的进行一个相对公平的测试,他们使用了一个非常简单的微服务,没有外部依赖关系(比如数据库),代码路径非常短(只是操纵字符串),使用了小型的、轻量级的框架(Helidon for Java和Go工具包for Go),试验了不同版本的Java和不同的jvm。

对决双雄

我们先来看下擂台两边的选手:

  • 身穿深色战服的选手是JAVA

Java是由被甲骨文收购的Sun Microsystems开发的。它的1.0版本是1996年发布的,最新的版本是2020年的Java15。主要的设计目标是Java虚拟机和字节码的可移植性,以及带有垃圾收集的内存管理。它是全世界最流行的语言之一,在开源环境下开发。

我们先看下JAVA的问题,大家普遍认为它最大的问题就是速度慢,已经慢到让人觉得不再是合理的,而是更具历史意义的。不过这么多年来,Java诞生了很多不同的垃圾收集算法用来加快它运行的速度。

Oracle实验室最近已经开发了一个新的Java虚拟机GraalVM,它有一个新的编译器和一些令人兴奋的新特性,比如能够将Java字节码转换成一个本机映像,可以在没有javavm的情况下运行等。

  • 而它的对手就是年轻充满活力的GO

GO是由谷歌的罗伯特·格里默、罗伯·派克和肯·汤姆森创建的。他们对UNIX、B、C、Plan9、UNIX窗口系统等做出了重大贡献。GO是开源的,在2012年发布了1.0版本(比JAVA晚了16年),在2020年发布了1.15版本。无论是在采用方面,还是在语言和工具生态系统本身方面,它都在快速增长。

GO受C、Python、JavaScript和C++等多种语言的影响。被设计成高性能网络和多处理的最佳语言。

StackOverflow有27872个关于Go的问题,而Java却有1702730个。足见长Java生态的强大。

Go是一种静态类型的编译语言。它有称为goroutines的轻量级进程(这些不是OS线程),它们之间有独特的通信通道(类型化的,FIFO)。Go是许多CNCF项目的首选语言,例如Kubernetes、Istio、Prometheus和Grafana

赛前对比

从个人感觉来说,Go相比JAVA来说,优点在于:

  • Go更容易实现复合、纯函数、不变状态等功能模式。

  • Go处于生命周期的早期,因此它没有向后兼容性的沉重负担—Go仍然可以轻易打破某些限制来改进。

  • Go编译成一个本机静态链接的二进制文件-没有虚拟机层-二进制文件拥有运行程序所需的一切,这对于“从头开始”的容器来说非常好。

  • Go体积小、启动快、执行快(目前是的)

  • Go没有OOP,继承,泛型,断言,指针算法

  • Go写法上较少的括号

  • Go没有循环依赖、没有未使用的变量或导入、没有隐式类型转换的强制

  • Go样板代码少得多

缺点是:

  • Go工具生态系统还不成熟,尤其是依赖关系管理——有几个选项,没有一个是完美的,特别是对于非开源开发;仍然存在兼容性挑战。

  • 构建具有新的/更新的依赖项的代码非常慢(比如Maven著名的“下载Internet”问题)

  • 导入将代码绑定到存储库,这使得在存储库中移动代码成为一场噩梦。

  • 调试、评测等仍然是一个挑战

  • 用到了指针

  • 需要实现一些基本的算法

  • 没有动态链接

  • 没有太多旋钮来调优执行或垃圾收集、概要文件执行或优化算法。

比赛开始

使用JMeter来运行负载测试。这些测试多次调用这些服务,并收集有关响应时间、吞吐量(每秒事务数)和内存使用情况的数据。对于Go,收集驻留集大小;对于Java,跟踪本机内存。

在测量之前,使用1000次服务调用对应用程序进行预热。

应用程序本身的源代码以及负载测试的定义都在这个GitHub存储库中:https://github.com/markxnelson/go-java-go

第一回合

在第一轮测试中,在一台“小型”机器上进行了测试,是一台2.5GHz双核Intel core i7笔记本电脑,16GB内存运行macOS。测试运行了100个线程,每个线程有10000个循环,上升时间为10秒。Java应用程序运行在JDK11和Helidon2.0.1上。使用Go 1.13.3编译的Go应用程序。

结果如下:

可以看出,第一回合是Go赢了!

JAVA占的内存太多了;预热对JVM有很大的影响—我们知道JVM在运行时会进行优化,所以这是有意义的

在第一回合的基础上,意犹未尽的又引入GraalVM映像以使 Java 应用程序的执行环境更接近于 Go 应用程序的环境,添加了 GraalVM 映像测试(用 GraalVM EE 20.1.1ー JDK 11构建的本机映像)的结果是:

通过使用 GraalVM 映像在 JVM 上运行应用程序,我们没有看到吞吐量或响应时间方面的任何实质性改进,但是内存占用的确变小了。

下面是一些测试的响应时间图:

第二回合

在第二轮测试中,使用一台更大的机器上运行测试。36核(每个核两个线程)、256GB内存、运行oraclelinux7.8的机器。

和第一轮类似,使用了100个线程,每个线程使用了10,000个循环,10秒的加速时间,以及相同版本的 Go,Java,Helidon 和 GraalVM。

结果如下:

这一回合是GraalVM 映像赢了!

下面是一些测试的响应时间图:

在这个测试中,Java变体的表现要好得多,并且在没有使用Java日志记录的情况下,它的性能大大超过了Go。Java似乎更能使用硬件提供的多核和执行线程(与Go相比)。

这一轮的最佳表现来自GraalVM native image,平均响应时间为0.25毫秒,每秒事务数为82426个,而Go的最佳结果为1.59毫秒和39227个tps,然而这是以多占用两个数量级的内存为代价的!

GraalVM映像比在jvm上运行的同一应用程序快大约30–40%!

第三回合

这次,比赛在Kubernetes集群中运行这些应用程序,这是一个更自然的微服务运行时环境。

这次使用了一个Kubernetes 1.16.8集群,它有三个工作节点,每个节点有两个内核(每个内核有两个执行线程)、14GB的RAM和oraclelinux7.8。

应用程序访问是通过Traefik入口控制器进行的,JMeter在Kubernetes集群外运行,用于一些测试,而对于其他测试,使用ClusterIP并在集群中运行JMeter。

与前面的测试一样,使用了100个线程,每个线程使用了10,000个循环,以及10秒的加速时间。

下面是各种不同容器的大小:

  • Go 11.6MB 11.6 MB

  • Java/Helidon 1.41GB 1.41 GB

  • Java/Helidon JLinked 150MB 150mb

  • Native image 25.2MB 25.2 MB

结果如下:

下面是一些测试的响应时间图:

在这一轮中,我们观察到 Go 有时更快,GraalVM 映像有时更快,但这两者之间的差别很小(通常小于5%)。

Java似乎比Go更善于使用所有可用的内核/线程—在Java测试中看到了更好的CPU利用率。Java性能在拥有更多内核和内存的机器上更好,Go性能在较小/功能较弱的机器上更好。在一台“生产规模”的机器上,Java很容易就和Go一样快,或者更快

最后

接下来会做更多的测试比赛,来看一看究竟谁更好!

有兴趣的你也可以自己试一试,记得告诉我们结果哦!

昨晚逛GitHub,无意中看到一位大佬(https://github.com/halfrost)的算法刷题笔记,感觉发现了宝藏!有些小伙伴可能已经发现了,但咱这里还是忍不住安利一波,怕有些小伙伴没有看到。

关于算法刷题的困惑和疑问也经常听朋友们提及。这份笔记里面共包含作者刷LeetCode算法题后整理的数百道题,每道题均附有详细题解过程。很多人表示刷数据结构和算法题效率不高,甚是痛苦。有了这个笔记的总结,对校招和社招的算法刷题帮助之大不言而喻,果断收藏了。

需要刷题笔记PDF文档的小伙伴可以直接长按扫码关注下方二维码,回复 「刷题笔记」 四个字自取:

关注下方公众号

????????????

回复关键字「刷题笔记」,即可下载

笔记版权归原作者所有,转载请注明出处 https://books.halfrost.com/leetcode/

Java微服务 vs Go微服务,究竟谁更强!?相关推荐

  1. 五十五张图告诉你微服务的灵魂摆渡者Nacos究竟有多强?

    前言 Nacos是阿里巴巴开源的服务注册中心以及配置中心,致力于给开发者提供一款便捷.简单上手的开源框架. Nacos究竟有什么惊人的地方呢?看下图: 从上图不难看出阿里巴巴的野心,一个Nacos干掉 ...

  2. 微服务go还是java,Java微服务 vs Go微服务,究竟谁更强!?

    前言 Java微服务能像Go微服务一样快吗? 这是我最近一直在思索地一个问题. 去年8月份的the Oracle Groundbreakers Tour 2020 LATAM大会上,Mark Nels ...

  3. 《MySQL必修课:存储引擎大揭秘!InnoDB和MyISAM究竟谁更强?》

    文章目录 本章学习目标 第一节 MySQL存储引擎 1.1 InnoDB和MyISAM对比 1.2 InnoDB存储结构 1.2.1.InnoDB内存结构 1.2.2.InnoDB磁盘结构 1.2.3 ...

  4. Go、Java、C++,下一代测序工具开发谁更强?

    作者 | Pascal Costanza, Charlotte Herzeel & Wilfried Verachtert 译者 | 弯月,责编 | 夕颜 出品 | CSDN(ID:CSDNn ...

  5. java开发用i5还是i7,i7比i5更强!为什么内行人都选i5而不选i7?看完瞬间懂了

    i7比i5更强!为什么内行人都选i5而不选i7?看完瞬间懂了 2020-11-19 11:18:08 4点赞 0收藏 0评论 许多人认为i7比i5更好,那么有什么好呢?让我们先看一下区别. i7使用四 ...

  6. Java微服务 vs Python微服务 PK

    Java微服务 vs Python微服务 PK 微服务能力 Java微服务生态 Python微服务生态 备注 后台框架/微服务框架 spring boot/cloud django/Nameko ja ...

  7. Java VS Go,微服务究竟谁更快?

    作者 | 程序猿DD   责编 | 张文 头图 | CSDN 下载自视觉中国 Java 微服务能像 Go 微服务一样快吗?这是我最近一直在思索的一个问题. 去年 8 月份的 the Oracle Gr ...

  8. Java生鲜电商平台-微服务架构概述

    Java生鲜电商平台-微服务架构概述 单体架构存在的问题 在传统的软件技术架构系统中,基本上将业务功能集中在单一应用内,或者是单一进程中.尽管现代化的软件架构理论以及设计原则已推广多年,但实际技术衍化 ...

  9. Java生鲜电商平台-微服务入门与服务的拆分架构实战

    Java生鲜电商平台-微服务入门与服务的拆分架构实战 刚开始进入软件行业时还是单体应用的时代,前后端分离的概念都还没普及,开发的时候需要花大量的时间在"强大"的JSP上面,那时候S ...

最新文章

  1. 技术人员关注的几个优质公众号
  2. 文献管理软件 JabRef 快速入门
  3. elasticsearch中 refresh 和flush区别【转】
  4. canvas 实现图片局部模糊_JavaScript中的图片处理与合成(四)
  5. 如何不让Oracle使用Linux的swap分区
  6. ubuntu16.04 每次开机都显示“System program problem detected”
  7. centos 关闭命令行警报声
  8. java.net.bindexception: address already in use: jvm_bind:8080
  9. ZigBee-CC2530单片机 - 1路硬件PWM控制舵机角度(精度为1us)
  10. 深度linux15.4安装教程,国产操作系统深度Deepin15.5安装过程体验!
  11. AI智能名片系统源码
  12. 计数器集成芯片+分析时序逻辑电路
  13. 小学教师计算机个人研修计划,小学教师信息技术个人研修计划书
  14. 如何注册Twitter,来学
  15. ASCII码对照表(转载)
  16. mysql怎么增加内存_如何加mysql5.5运行内存
  17. 用h5video和h5stream实现监控视频的播放--rtsp流
  18. 锐捷睿易RAP100全新上市 WALL AP也有超高性能
  19. DAGM2007数据集转换成VOC格式
  20. jquery怎么实现点击刷新当前页面

热门文章

  1. BZOJ.5249.[九省联考2018]iiidx(贪心 线段树)
  2. CC2540获取本机MAC地址
  3. (转) SpringBoot非官方教程 | 第二篇:Spring Boot配置文件详解
  4. CentOS VMware 配置IP小结 静态 配置 桥接 NAT
  5. ODBC更新记录集提示”记录集为只读“
  6. 判断JS对象是否拥有某属性两种方式
  7. call_user_func用法
  8. Datawhale组队学习周报(第021周)
  9. 线性代数:05 实对称矩阵与二次型
  10. StaticFactoryMethod_Level1