Java,Go和Rust之间的比较 - Dexter


这是Java,Go和Rust之间的比较。这不是基准测试,而是关于:可执行文件大小、内存使用、CPU使用率、运行时要求之间的比较,当然还有一个小的基准测试,可以每秒获取一些请求。
测试三个Web服务的存储库托管在github上。直接看结论:

结论
在得出任何结论之前,我想指出这三种语言之间的关系(或缺乏)。Java和Go都是垃圾收集语言,但是Java会提前编译为在JVM上运行的字节码。启动Java应用程序时,将随时随地(JIT)编译器调用,以通过将字节码编译为本地代码来优化字节码,以提高应用程序的性能。
Go和Rust都提前编译为本地代码,并且在运行时不会进行进一步的优化。
Java和Go都是垃圾收集语言,具有暂停应用导致类似世界末日的副作用。这意味着,每当垃圾收集器运行时,它将停止应用程序,进行垃圾收集,并在完成后从停止的地方恢复应用程序。大多数垃圾收集器需要停止运行,但是有些实现似乎不需要这样做。
当Java语言在90年代创建时,其最大的卖点之一是一次编写,可在任何地方运行。当时这非常好,因为市场上没有很多虚拟化解决方案。如今,大多数CPU支持虚拟化,这种虚拟化仅在代码可以在任何地方(无论如何在任何受支持的平台上运行)的前提下,才停止使用某种语言进行开发的诱惑。Docker和其他解决方案以便宜的价格提供虚拟化。
在整个测试中,应用程序的Java版本比Go或Rust对应版本消耗了更多的内存,在前两个测试中,Java使用的内存大约增加了8000%。这意味着对于实际应用程序,Java应用程序的运行成本会更高。
对于前两个测试,Go应用程序使用的CPU比Java少20%,同时处理38%的请求。另一方面,Rust版本使用的CPU比Go减少了57%,而处理的请求却增加了13%。
第三次测试在设计上是占用大量CPU的资源,因此我想从中挤出CPU的每一分。Go和Rust都比Java使用了1%的CPU。而且我认为,如果wrk不是在同一台计算机上运行,​​那么这三个版本都会使CPU的上限为100%。在内存方面,Java使用的内存比Go和Rust多2000%。Java可以处理的请求比Go多出20%,而Rust可以处理的请求比Java多出15%。
在撰写本文时,Java编程语言已经存在了将近30年,这使得在市场上寻找Java开发人员变得相对容易。另一方面,Go和Rust都是相对较新的语言,因此与Java相比,自然而然的数量或更少的开发人员。不过,Go和Rust都获得了很大的吸引力,许多开发人员正在将它们用于新项目,并且有许多使用Go和Rust的生产中正在运行的项目,因为简单地说,就资源而言,它们比Java更有效。(也许是因为它们是街上的新酷语言!)
在编写本文的程序时,我同时学习了Go和Rust。就我而言,Go的学习曲线很短,因为它是一种相对容易掌握的语言,并且与其他语言相比语法很小。我只用了几天就用Go编写了程序。关于Go需要注意的一件事是编译速度,我不得不承认,与Java / C / C ++ / Rust等其他语言相比,它的速度非常快。该程序的Rust版本花了我大约一个星期的时间来完成,Rust具有严格的所有权规则,但是一旦掌握了Rust的所有权和借用概念,编译器错误消息就会突然变得更加有意义。违反借阅检查规则时Rust编译器对您大吼的原因,这是因为编译器希望在编译时证明已分配内存的寿命和所有权。这样做可以保证程序的安全性(例如:没有悬挂的指针,除非使用了不安全的代码转义),并且在编译时确定了释放位置,从而消除了垃圾收集器的需求和运行时成本。当然,这是以学习Rust的所有权系统为代价的。
在竞争方面,我认为Go是Java(通常是JVM语言)的直接竞争对手,但不是Rust的竞争对手。另一方面,Rust是Java,Go,C和C ++的重要竞争对手。
Rust比Go具有根本优势。它不是垃圾收集的语言,与C和C ++相比,它可以安全地编写代码。例如,Go并不是特别适合用于编写OS内核,而这里又是Rust的亮点,并与C / C ++竞争,因为它们是使用OS编写的长期存在和事实上的语言。Rust与C竞争的另一种方式/ C ++在嵌入式世界中。