最后
金三银四到了,送上一个小福利!
StackOverflow有27872个带“Go”的问题,而Java只有1702730个。足见长江后浪推前浪。
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集群中运行这些应用程序,这是一个更自然的微服务运行时环境。
最后
我想问下大家当初选择做程序员的初衷是什么?有思考过这个问题吗?高薪?热爱?
既然入了这行就应该知道,这个行业是靠本事吃饭的,你想要拿高薪没有问题,请好好磨练自己的技术,不要抱怨。有的人通过培训可以让自己成长,有些人可以通过自律强大的自学能力成长,如果你两者都不占,还怎么拿高薪?
架构师是很多程序员的职业目标,一个好的架构师是不愁所谓的35岁高龄门槛的,到了那个时候,照样大把的企业挖他。为什么很多人想进阿里巴巴,无非不是福利待遇好以及优质的人脉资源,这对个人职业发展是有非常大帮助的。
如果你也想成为一名好的架构师,那或许这份Java核心架构笔记你需要阅读阅读,希望能够对你的职业发展有所帮助。
中高级开发必知必会: