文章插图
这是JAVA,Go和Rust之间的比较 。这不是基准测试,而是更多输出可执行文件大小,内存使用,CPU使用率,运行时要求之间的比较,当然还有一个小的基准测试,可以每秒获取一些请求,并尝试使 一些数字的感觉 。
内存使用情况空闲,无所事事
文章插图
> Memory usage of each Application while running idle in memory.
什么? Go和Rust版本的条形图在哪里显示空闲时的内存占用量? 好了,它们在那里,只有当JVM启动程序并处于空闲状态时,Java才消耗160 MB以上的内存,什么也没做 。对于Go,程序使用0.86 MB,对于Rust,则使用0.36 MB 。这是一个很大的差异! 在这里,Java使用的内存比Go和Rust对应的内存高两个数量级,只是坐在内存中什么都不做 。那是巨大的资源浪费 。
执行文件尺寸有关如何构建二进制文件的一些信息 。在Java的情况下,我已经使用maven-shade-plugin将所有内容构建到一个大的jar中,并使用了mvn packagetarget 。对于Go,我使用了go build 。最后,对于Rust,我使用了build –release版本 。
文章插图
> Compiled size of each program in megabytes.
工件编译后的大小还取决于所选的库/依赖项,因此,如果它们肿,则编译后的程序将最终相同 。在我的特定情况下,对于我选择的库,以上是程序的编译大小 。
在单独的部分中,我将把这三个程序构建并打包为Docker映像,并列出它们的大小,以显示每种语言所需的运行时开销 。下面有更多详细信息 。
为了尝试将苹果与苹果进行比较(也许是?),我在此比较中使用每种语言编写了一个Web服务 。Web服务非常简单,它为三个REST端点提供服务 。
文章插图
【Java,Go和Rust之间的比较】> The endpoints served by the web service, in Java, Go, and Rust.
这三个Web服务的存储库托管在github上 。
服务REST请求让我们使用wrk使用请求访问API,并观察内存和CPU使用情况,以及在我的计算机上针对程序的三个版本的每个端点每秒实现的请求数 。
wrk -t2 -c400 -d30s http://127.0.0.1:8080/hello wrk -t2 -c400 -d30s http://127.0.0.1:8080/greeting/Janewrk -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格式返回 。
文章插图
> CPU usage while hitting the /hello endpoint
文章插图
> Memory usage while hitting the /hello endpoint
文章插图
> Requests per second while hitting the /hello endpoint
运行时大小为了模拟现实世界中的云本机应用程序,并消除"它可以在我的机器上运行!",我为这三个应用程序中的每一个创建了一个docker映像 。
Docker文件的源包含在相应程序文件夹下的存储库中 。
作为Java应用程序的基本运行时映像,我使用过openjdk:8-jre-alpine,该映像被称为是最小的映像之一,但是,这带有一些警告,这些警告可能适用于您的应用程序,也可能不适用于您的应用程序,主要是高山图片在处理环境变量名称方面不符合posix,因此您不能使用 。docker文件中ENV中的(点)字符(没什么大不了的),另一个是阿尔卑斯linux映像是使用musl libc而不是glibc编译的,这意味着如果您的应用程序依赖于需要glibc(或朋友)的东西 )显示,它根本无法正常工作 。以我为例,高山行之有效 。
至于应用程序的Go和Rust版本,我已经对其进行了静态编译,这意味着它们不希望在运行时映像中存在libc(glibc,musl…等),这也意味着它们不需要 运行OS的基本映像 。因此,我使用了临时docker映像,这是一个无操作映像,以零开销托管托管已编译的可执行文件 。
推荐阅读
- 店铺活动和促销工具有哪些 促销的工具有哪些
- 菊花茶和玫瑰花茶区别,冲泡玫瑰花茶四大注意事项
- JavaScript中常见排序算法详解
- Java 内存泄露的理解与解决过程
- 直通车点击量和点击率的区别 直通车点击率是什么意思
- 花甲不能和什么一起吃
- 乌鸡不能和什么一起吃
- 小苏打和白醋_白醋和小苏打 小苏打和白醋的作用是什么?
- 五味子和硒麦芽能不能起包水喝,喝菊花茶的好处和坏处
- 玫瑰花茶可以和什么搭配,玫瑰花茶怎么泡