目前开发中爆火的Java、Go和Rust间的比较!

制品编译的大小也取决于所选的库/依赖项,因此,如果它们膨胀了,那么编译的程序也会是同样的结果。在此处特定情况下,对于我所选择的库,上图显示是程序编译的大小。

在下面单独的部分中,我将构建所有三个程序并打包成Docker镜像,并列出它们的大小,以及显示每种语言所需的运行时开销。更多细节如下。

内存使用情况

空闲状态

什么?在空闲运行时显示内存占用的Go和Rust版本的条形图在哪?好吧,它们是有的,只是Java在JVM启动程序,处于空闲时,什么都不做的情况下,就消耗了高达160MB的内存。在Go的情况下,程序使用了0.86 MB,在Rust的情况下使用0.36 MB。这是一个非常大的区别!在这里,Java比Go和Rust对应的程序多用了两个数量级的内存,只是空跑内存什么也不做。这是对资源的巨大浪费。

提供REST请求

我们使用wrk[3]来请求API,并观察内存和CPU使用情况,以及三个版本的程序的每个端点在我的机器上的每秒请求数。

wrk -t2 -c400 -d30s http://127.0.0.1:8080/hello

wrk -t2 -c400 -d30s http://127.0.0.1:8080/greeting/Jane

wrk -t2 -c400 -d30s http://127.0.0.1:8080/fibonacci/35

以上wrk命令表示,使用两个线程(用于wrk),并在池中保持400个开启的连接,并反复调用GET端点,持续30秒。此处我只使用两个线程,是因为wrk跟被测试的程序都运行在同一台机器上,因此我不想它们在可用资源,尤其是CPU上相互竞争。

每个Web服务都单独测试,且每次运行测试都会重启Web服务。

以下是每个版本的程序三次运行中的最佳结果。

/hello

该端点返回一个“Hello, World!”的消息。它分配字符串 “Hello, World!”,并将其序列化,以JSON格式返回。

/greeting/{name}

该端点接受段路径参数{name},然后将字符串"Hello,{name}"格式化,序列化并返回以JSON格式的问候信息。

/fibonacci/{number}

该端点接受段路径参数{number}并以JSON格式序列化返回输入的数字和斐波那契数。

对于这个特定的端点,我选择用递归的形式来实现它。我知道,毫无疑问,迭代实现可以获得更好的性能结果,而且出于生产目的,应该选择迭代形式,但是在生产代码中,有些情况下必须使用递归(非特指专用于计算斐波那契数)。因此我想让这个实现与CPU堆栈分配密切相关。

在/fibonacci端点测试中,Java实现是唯一一个出现150次请求超时的,wrk输出如下所示:

运行时大小

为了模仿真实世界的云原生应用,并消除"它在我的机器上正常!"这种情况,我为这三个应用分别创建了一个Docker镜像。

Docker源文件包含在存储库中相应程序的文件夹下。

最后

由于篇幅原因,就不多做展示了

14763835333)]

[外链图片转存中…(img-OoGGk2SR-1714763835333)]

[外链图片转存中…(img-NRELRQ6D-1714763835333)]

[外链图片转存中…(img-vvy6UIkZ-1714763835334)]

由于篇幅原因,就不多做展示了

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

  • 9
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值