Java、Go 和 Rust 的比较(1)

每个应用程序在内存中空闲时的内存使用情况。

Go 和 Rust 版本在空闲时显示内存占用几乎看不到,只是当 JVM 启动程序并闲置不做任何事情时,Java 消耗了 160 MB 以上的空间。在 Go 的情况下,程序使用 0.86 MB,在 Rust 的情况下使用 0.36 MB。这是一个很大的不同! 因为这是在内存中什么也不做情况下 ,Java 内存占用比 Go 和 Rust 对应物多两个数量级,所以这是对资源的巨大浪费。

REST 请求

让我们使用 wrk 通过请求访问 API 并观察内存和 CPU 使用情况,以及我的机器上针对程序的三个版本的每个请求地址请求的 qps。

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 个打开的连接,并在 30 秒的持续时间内重复调用 GET 请求。这里我只使用了两个线程,因为 wrk 和被测程序都在同一台机器上运行,所以我不希望它们在可用资源上(尤其是 CPU)相互竞争。

每个 Web 服务都分别进行了测试,并且在每次运行之间重新启动了 Web 服务。下面这个请求是该程序每个版本的三个运行中最好的一个。

/hello

此请求返回 Hello, World! 信息。它分配字符串“Hello, World!” 并将其序列化并以 JSON 格式返回。

请求 /hello 时的 CPU 使用率

访问 /hello 时的内存使用情况

访问 /hello qps

/greeting/{name}

此请求接受段路径参数 { name },然后格式化字符串“ Hello, {name}!” , 将其序列化并作为 JSON 格式的问候消息返回。

请求 /greeting/{name} 时的 CPU 使用率

访问 /greeting/{name} 时的内存使用情况

访问 /greeting/{name} qps

/fibonacci/{number}

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

这个特定接口我选择以递归形式实现它。毫无疑问通过迭代实现会产生更好的性能结果,并且出于生产目的,应该选择迭代形式,但是在生产代码中存在必须使用递归的情况(不一定是专门用于计算第 n 个斐波那契数)。另外为了测试性能对比,通过该实现能够使大量 CPU 参与堆栈分配。

请求 /fibonacci/{number} 时的 CPU 使用率

访问 /fibonacci/{number} 时的内存使用情况

访问 /fibonacci/{number} qps

在 Fibonacci 接口期间,Java 实现是唯一一个在 150 个请求上出现超时的编程语言,如下面wrk的输出所示。

/fibonacci 请求的延迟

运行时大小


为了模拟真实世界的云原生应用程序,并消除“它可以在我的机器上运行!”的问题,我为这三个应用程序中的每一个都创建了一个 docker 镜像。

作为java应用程序的基础运行时镜像,我使用了openjdk:8-jre-alpine,这是已知的尺寸最小的镜像之一,然而,这有一些注意事项,可能适用于也可能不适用于你的应用程序,主要是alpine镜像在处理环境变量名方面不符合posix标准,所以你不能在docker文件中使用. 字符在 docker 文件中的 ENV(不是什么大问题),另一个问题是,alpine Linux 镜像是用 musl libc 而不是 glibc 编译的,这意味着如果你的应用程序依赖于需要 glibc(或朋友)存在的东西,它根本无法工作。 在我的例子中,alpine 工作就很好。

对于 Go 和 Rust 版本的应用程序,我对它们进行了静态编译,这意味着它们不需要 libc(glibc,musl…等)存在于运行时镜像中,这也意味着它们不需要一个带有操作系统的基础镜像来运行。所以我使用了scratch docker镜像,它是一个以零开销的方式承载编译后的可执行文件。

我使用的docker镜像的命名规则是{lang}/webservice。该应用程序的 Java、Go 和 Rust 版本的镜像大小分别为 113、8.68 和 4.24 MB。

最终的 Docker 镜像大小

结论

三种语言的比较

最后

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
开发知识点,不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!**

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

  • 18
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值