哪种编程语言耗电最少?

2020-10-18 18:44:54

去年,一个由来自三所不同大学的6名葡萄牙研究人员组成的团队决定研究这个问题,最终发表了一篇题为“跨编程语言的能源效率”的论文。他们运行了用27种不同语言编写的10个编程问题的解决方案,同时仔细监控每个问题的用电量-以及速度和内存使用情况。

具体地说,他们使用了计算机语言基准游戏(Computer Language Benchmark Game)中的10个问题,这是一个用于比较性能的免费软件项目,其中包括一组标准的简单算法问题,以及一个运行测试的框架。(它的前身是“伟大的计算机语言枪战”。)。“这使我们能够获得一套具有可比性、代表性和广泛性的程序…。以及编译/执行选项和编译器版本。“。

运行各种基准测试很重要,因为最终它们的结果会根据执行的测试而有所不同。例如,总的来说,C语言被证明是最快的,也是最节能的。但在涉及扫描DNA数据库以寻找特定基因序列的基准测试中,铁锈是最节能的-而C排在第三位。

然而,即使在同样的测试中,“最好”的语言也取决于你的标准是什么。在那次测试中,C语言也被证明只是第二快的语言(同样,排在Rust之后)。但如果根据内存使用情况对结果进行排序,拉斯特的排名整整下降了9位。虽然Fortran是这项测试的第二高能效语言,但当结果按执行时间排序时,它也下降了整整六位。

研究人员指出,他们“严格遵循”CLBG项目关于编译器版本和最佳优化标志的指导方针。功耗是使用英特尔的一种工具-运行平均功率限制工具-进行测量的,每个程序不只执行一次,而是执行10次,“以减少冷启动和缓存影响的影响,并能够分析测量的一致性并避免异常值。”(出于这个原因,他们报告说“测量结果相当一致”。)。为了增加一致性,所有的测试都是在运行Linux Ubuntu Server 16.10(内核版本4.8.0-22-通用)的台式机上进行的,具有16 GB的RAM和3.20 GHz的Haswell Intel Corei5-4460 CPU。

与Pascal相比,Lisp的平均能耗(131.34J)是C的2.27倍,执行时间(4926.99ms)是C的2.44倍,所需的内存(126.64MB)是Pascal的1.92倍。

他们还比较了编译语言和解释语言的结果(对运行在虚拟机上的语言进行了单独的分类)。本文还对不同的编程范例进行了单独的比较-包括函数式编程和命令式编程,以及面向对象的编程和脚本。

这篇论文仔细研究了一个常见的假设,即速度更快的程序总是使用更少的能量,指出它并不像物理定律说的E(能量)=T(Ime)x P(Power)那么简单。研究人员指出,这在一定程度上是因为电力没有以一致的速度消耗,这表明这可能会影响其他研究人员调查程序的运行时间是否影响其能耗的工作。(“关于这个问题的结论有时会有分歧…”)。在他们的一项基准测试中,Chapel程序的执行时间比用Pascal语言编写的同等程序少55%-然而,Pascal程序使用的能源却少了10%。

因此,尽管人们仍然普遍认为,当程序运行得更快时,能耗会降低,但研究人员毫不含糊地表示,“速度更快的语言并不总是最节能的。”

这可能是一个很难回答的问题,因为功耗受到许多因素的影响(包括编译器的质量和使用的库)。但最终,研究人员甚至能够根据能耗是由CPU还是DRAM消耗来细分能耗-得出的结论是,大部分电量(约88%)平均由CPU消耗,无论基准程序是在虚拟机上编译、解释还是运行。

有趣的是,口译语言显示出稍高的变化,CPU有时消耗高达92.90%的功率,或低至81.57%。

在研究了他们的结果后,研究人员还得出结论,DRAM的峰值使用和能源消耗之间的关系“几乎不存在”。

这项研究对这个长期存在的问题提供了更多的见解:更快的速度更环保吗?是的,确实“最节能的五种语言在按执行时间排序时保持了它们的排名,并且在能量和时间值上都有很小的差异。”

事实上,对于十分之九的基准问题,最高分(速度和能效)来自总体速度最快、最节能的前三名语言之一-这并不让研究人员感到惊讶。众所周知,正如我们的数据所显示的那样,这三大语言(C、C++和Rust)在执行性能方面进行了大量优化和高效。

但是,当您按照运行时对其他24种语言进行排名时,您看到的顺序与对它们进行能效排名时所看到的顺序不同。只有四种语言保持相同的能量和时间顺序(OCaml、Haskel、Sracket和Python),其余语言则完全混乱。

即使是在单独的基准测试中,也有快速执行的语言并不是最节能的情况。

还有其他有趣的结果。编译语言“往往”是最节能、运行速度最快的语言--他们的论文甚至可以用数字来量化这种差异。平均而言,编译语言执行解决方案消耗120J[焦耳],而对于虚拟机和解释语言,此值分别为576J和2365J。

研究人员在比较执行时间时也应用了同样的精确度,得出的结论是,“编译语言平均耗时5103毫秒,虚拟机语言耗时20623毫秒,解释语言耗时87614毫秒。”

在这两个类别的前五种语言中,有四种是编译的。(例外?Java。)。

翻译速度最慢的五种语言都是:Lua、Python、Perl、Ruby和TypeScript。并解释了消耗能量最多的五种语言:Perl、Python、Ruby、JRuby和Lua。

但与此同时,当使用正则表达式操作字符串时,五种最节能的语言中有三种是解释型语言(TypeScript、JavaScript和PHP),“尽管它们在其他场景中往往不是很节能”。

编译语言也占据了使用的内存空间最少的前五个位置。

“平均而言,编译语言需要125MB,虚拟机语言需要285MB,解释语言需要426MB,”研究人员报告说。与此同时,解释型语言占据了五个垫底位置中的四个,这意味着它们消耗的内存空间最多:JRuby、Dart、Lua和Perl。(虽然Erlang不是一种解释型语言,但它也会出现在后五名中,介于Dart和Lua之间)。

如果按编程范例分类,命令式语言需要116Mb,面向对象的需要249Mb,功能性的需要251Mb,最后是脚本需要421Mb。

事实上,在比较不同的范例时,命令式编程常常排在首位。与面向对象、函数式和脚本范型的基准程序相比,其基准程序的平均能耗也要低得多,运行速度也快得多。

但有很多因素需要考虑。“很明显,不同的编程范例,甚至同一范例中的语言,对能耗、时间和内存都有完全不同的影响,”研究人员写道。然而,其中哪一个最重要将取决于您的方案。(例如,后台任务并不总是需要最快的运行时间。)。

而且一些应用程序需要考虑两个因素,例如,能源使用和执行时间。在这种情况下,“C是最好的解决方案,因为它在两个单一目标中都占主导地位,”研究人员写道。如果您试图在使用较少内存的情况下节省时间,那么C、Pascal和Go“是等价的”-如果您观察所有三个变量(时间、能源使用和内存使用),情况也是如此。但是,如果您只是想在节省能源的同时使用较少的内存,那么您的最佳选择是C或Pascal。

在论文的最后,研究人员补充说,为了进一步研究,他们希望检查随着时间的推移,总内存使用量是否与消耗的能量有更好的相关性。

他们在网上分享他们的数据,这表明这使得未来的研究人员更容易进行比较,例如.NET语言或JVM语言。对于使用移动应用程序、物联网系统或其他使用有限电源的应用程序的开发人员来说,功耗是一个主要问题。

但最终,这项研究可能也会给程序员留下他们最讨厌的东西:模棱两可。研究人员报告说,如果你在寻找一种最好的编程语言,“这个问题没有具体和最终的答案。

研究人员总结道:“虽然每个基准测试中能源效率最高的语言几乎总是最快的,但事实是没有哪种语言总是比其他语言更好。”“一种语言的使用情况是决定该语言是否是最节能的选择的核心方面。”