欢迎来到Coolfensi推广平台,平台经营Instagram、Facebook、YouTube、TIKTOK、Twitter粉丝、点赞、播放量服务、客服微信:coolfensi 24小时在线欢迎咨询购买!
JavaScript、Python比C++慢8倍、29倍?
JavaScript、Python比C++慢8倍、29倍?公告:
欢迎来到Coolfensi推广平台,平台经营Instagram、Facebook、YouTube、TIKTOK、Twitter粉丝、点赞、播放量服务、客服微信:coolfensi 24小时在线欢迎咨询购买!

JavaScript、Python比C++慢8倍、29倍?

首页 Instagram   作者:coolfensi  2022年08月04日  热度:7322  评论:0     
时间:2022-8-4 20:05   热度:7322° 
JavaScript、Python比C++慢8倍、29倍?

  近日,来自多伦多大学和YScope公司(为软件系统提供创新的日志管理和故障排除工具。由一群计算机工程教授和博士创立)的David Lion、多伦多大学Adrian Chiu和Michael Stumm、多伦多大学和YScope公司Ding Yuan共同发布了一份《调查托管语言的运行时性能:为什么JavaScript和Python比C++慢了8倍和29倍,而Java和Go却能更快》的论文分析报告,深度剖析了不同编程语言运行时在代码开发中真实的性能情况,由此方便开发者可以精确地测量执行任何字节码指令所花费的时间等。

  性能是系统软件不得不面对的挑战

  在报告中,研究人员指出,自2015年以来,具有集成运行时环境的编程语言越来越受欢迎,其中,全球知名的代码托管平台GitHub上最受欢迎的三种语言分别是JavaScript、Java和Python。

  作为开发利器,编程语言帮助开发者快速构建各种应用程序和服务,也极大地提高了生产力。同时,这些语言自身也提供了各种功能,如动态类型检查、带有垃圾收集的内存管理,以及动态内存安全检查等等。为此,研究人员用「托管语言」(managed languages)专业术语来指代这些类型的编程语言。

  现实来看,托管语言越来越多地被用于实现性能至关重要的系统软件上,如Hadoop和Spark都在Java虚拟机(JVM)上运行,因为它们分别用Java和Scala实现;Kubernetes、etcd(分布式键值存储)和M3(由Uber建立的分布式时间序列数据库和查询引擎)都是用Go实现的。

  当前,甚至连操作系统(OS)的内核Biscuit也是用Go实现的。Openstack、Paypal、Instagram和Dropbox都大量使用Python,其中,Python是Dropbox"在后台服务和桌面客户端应用中使用最广泛的语言",在一个存储库中就有近400万行Python代码;JavaScript也被用于Facebook的Bladerunner pub/sub系统的性能关键路径中。

  在开发过程中,编程语言的性能在一开始很少会被考虑到项目中,部分原因是不少开发者认为性能问题可以在以后慢慢去解决,也许可以通过简单地增加硬件来进行横向扩展。

  不过,随着代码产品或服务使用规模的扩大,服务变得越来越慢或者硬件成本变高,性能成为一个不容忽视的问题。这也是为什么Stream要放弃了Python而改用Go、Discord从Go切换到Rust、Twitter从Ruby on Rails切换到Scala和Java的主要原因。

  不少开发者往往为了提升性能,想破脑袋,但现实只有两条路,一条是从现有的代码中想尽办法尽可能地做优化,另一条是思考使用的编程语言是否已经达到了性能极限,看看有没有必要将旧的代码移植到一个新的性能更高的语言上。

  为了彻底解开系统软件中不同编程语言导致的性能问题,研究人员决定以C++为极限,对Java、Go、JavaScript和Python四种编程,还有应用最广泛的运行时系统CPython、OpenJDK。Node.js与JavaScript的V8引擎进行深入的定量性能分析。

  同时,研究人员还从头开始建立了6个应用程序,并创建了一个名为LangBench基准。这些应用程序涵盖了各种不同的计算强度、内存使用、网络和磁盘I/O强度以及可用的并发性的应用场景等复杂性。对此,研究人员全面分析了它们的完成时间、资源使用和可扩展性。

  测试方法

  值得一提的是,研究人员指出,这份论文没有也不可能全面地回答与语言运行时的性能有关的每一个问题。本文只是评估了四种语言的运行时,而且对于每种语言,只评估了最广泛使用的实现。此外,研究人员只在一个单一的操作系统/硬件堆栈上运行了工作负载。其研究结果与使用的基准有关,这些基准模拟了现实生活中的应用,但可能不代表广泛的应用。

  在测试方法上,研究人员在两台内部服务器上进行了实验,每台服务器有2个Xeon E5-2630V3、16个虚拟核心、2.4GHz CPU、256GB DDR4内存和两个7200 RPM硬盘。它们运行的系统是Linux 4.15.0,并通过10Gbps的互联网络连接。

  对于C++程序,研究人员使用的是GCC 9.3.0根据C++17标准用-O3进行编译。对于OpenJDK 13、CPython 3.8.1和Go 1.14.1,其使用了各自语言的参考实现。同时,使用Node.js 13.12.0和V8 7.9.317.25版本。

  研究人员对每个基准进行了5次测试,取平均值。其中,在运行键-值存储、日志分析器和文件服务器的基准时,client和worker线程的数量从1到1024不等。对于OpenJDK和V8来说,最小的内存量是通过确定不会导致崩溃的第一个堆配置来设置的;对于Go来说,GOGC被设置为5%。然后研究人员不断增加堆的设置,直到性能不再提高。其使用第一个设置的结果(即最小的堆大小)得出最佳性能。对于日志解析器和文件服务器基准,所用的日志文件被存储在一个复制系数为2的分布式文件系统上。在运行每个基准之前,研究人员都清除了Linux的页面缓存,以保证测试准确性。

  Java、Go更具竞争力,JavaScript、Python比C++慢了8倍和29倍

  最终LangBench中各项基准的运行时间结果:

  其中,优化的GCC平均速度最快,Go和OpenJDK紧随其后,比GCC慢了1.30倍和1.43倍。令人印象深刻的是,在12项基准测试中,Go和OpenJDK有3项超过了优化的GCC。

  总体而言,研究人员发现V8/Node.js和CPython表现最差,执行应用程序的平均速度分别比C++应用程序慢8.01倍和29.50倍,这意味着运行时下,JavaScript、Python要比C++慢这么多。更糟糕的是,这两个运行时上的应用程序扩展性很差,因为它们无法有效地利用多个内核。在极端情况下,CPython比GCC慢了129.66倍(在排序基准中)。V8/Node.js和CPython只有在工作负载受到磁盘I/O的瓶颈时,即在文件服务器基准中,才与GCC有竞争力。

  相比之下,OpenJDK和Go应用程序即Java和Go语言比C++更具有性能竞争力,运行速度仅慢了1.43倍和1.30倍,并且可以轻松扩展到多个内核。在一些应用中,OpenJDK和Go的性能超过了C++的同类产品。

JavaScript、Python比C++慢8倍、29倍?