当手机快没电的时候,管理软件会时常提醒我们关闭某些耗电大的应用。由此可见,除了硬件厂商,软件厂商也应该关注能耗。在这篇文章中,研究人员分析了各种编程语言的能耗比较。当能耗也成为重要指标时,我们该如何选择编程语言呢?2017年,一个由6名葡萄牙研究人员组成的团队决定调查这个问题,并发表了一篇名为《Energy Efficiency Across Programming Languages》的论文。他们用27种语言编写了10个问题(遵循相同的算法)的解决方案,然后运行解决方案,记录了功耗以及每种编程语言的速度和内存使用情况,排名结果如下图所示:通过这项研究,他们得出了一些有趣的结论,比如运行速度快的语言不一定耗能少。在论文中,作者还根据编程语言的执行类型(编译型、虚拟机或解释型)和编程范式(命令式、函数式、面向对象和脚本)对结果进行了分析。具体来说,研究人员使用了计算机语言基准测试游戏(一个用于比较性能的免费软件项目,包含一组标准的算法问题和运行测试的框架)中的10个问题,使研究更具可比性和代表性。运行各种基准测试很重要,因为它们的结果会因执行的测试而异。例如,C语言被认为是整体上最快和最节能的。但在涉及扫描DNA数据库以查找特定基因序列的基准测试中,Rust是最节能的,而C排在第三位。即使在同一个测试中,“最好”的语言也取决于你的标准。例如,在C位居第二而Rust第一位的测试中,如果按内存使用情况对结果进行排序,Rust将下降9位。在一项测试中,Fortran的能效排名第二,如果按运行时间排序,它也下降了6位。研究人员指出,他们严格遵守CLBG项目关于编译器版本和最佳优化标志的指南。功耗是使用Intel的工具-RunningAveragePowerLimit测量的,每个程序运行10次。“这是为了减少冷启动和缓存效应的影响,并能够分析测量的一致性并避免异常值,”作者说。为了保持一致性,所有测试都在运行LinuxUbuntuServer16.10(内核版本4.8.0-22-generic)的桌面上运行。快速语言是否更节能?该论文认真研究了一个常见的假设:更快的程序消耗更少的能量。研究人员指出,事实上,这并不像物理定律E(nergy)=T(ime)xP(ower)那么简单。这是因为电力没有以一定的速度消耗。在其他研究人员的一项研究中,Chapel程序的运行时间比用Pascal编写的等效程序少55%,但测量结果表明Pascal程序使用的能量反而少了10%。因此,虽然人们普遍认为当程序运行得更快时能耗会下降,但研究人员明确表示“更快的语言并不总是更节能”。这可能是一个很难回答的问题,因为功耗受许多因素影响(包括编译器的质量和使用的库)。但最终,研究人员得出的结论是,无论是编译型语言、解释型语言,还是虚拟机,大部分能量(平均约88%)实际上都被CPU消耗掉了。在分析实验结果后,研究人员还得出结论,DRAM峰值使用量与能耗之间“几乎没有关系”。该研究为一个长期存在的问题提供了答案:“更快更环保吗?”是的,是的,而且最节能的前5种语言按执行时间排序时仍然排在前5位,能量值和时间值的差距很小。事实上,在10个基准问题中,9个得分最高的语言(速度和能效)都跻身于最快和最能效的三种语言之列,这并不令研究人员感到惊讶。众所周知,正如研究中的数据所示,三种排名靠前的语言C、C++和Rust都经过了大量优化并高效运行。但当按运行时间对其他24种语言进行排名时,情况就不同了。只有4种语言保持相同的能量和时间排名(OCaml、Haskel、Racket和Python),而其余则完全分散。即使在单个基准测试中,也有速度快但不节能的语言。CompiledLanguages的优势CompiledLanguages似乎是最节能和运行最快的语言,作者甚至可以在论文中用数字量化差异。平均而言,编译型语言运行解决方案需要120J的能量,而虚拟机和解释型语言分别需要576J和2365J的能量。在比较执行时间时使用相同的精度,研究人员得出结论,编译型语言平均耗时5103毫秒,虚拟机语言20623毫秒,解释型语言87614毫秒。两个排名的前4都是编译型语言(Java语言除外)。最慢的5种语言都是解释型语言:Lua、Python、Perl、Ruby、Typescript。最耗能的五种语言也是解释型语言:Perl、Python、Ruby、JRuby、Lua。但与此同时,使用正则表达式操作字符串时最节能的5种语言(TypeScript、JavaScript和PHP)中有3种是解释型语言。尽管在其他情况下,它们往往不是很节能。编译型语言也占据内存使用最少的前5名。“平均而言,编译型语言需要125Mb,虚拟机语言需要285Mb,解释型语言需要426Mb,”研究人员说。具体来说,四种解释型语言在这个排名中垫底,这意味着它们占用的内存空间最多。“如果按照它们的编程范式来排序,命令式语言需要116Mb,面向对象语言需要249Mb,函数式编程语言需要251Mb,脚本语言需要421Mb。”事实上,在比较不同的范式时,命令式编程通常会名列前茅。与面向对象、函数式和脚本范式的基准相比,命令式编程的基准平均使用更少的能量并且运行速度更快。但是有很多因素需要考虑。“很明显,不同的编程范式,甚至是同一范式下的语言,对能耗、时间和内存的影响是完全不同的,”研究人员说。但是,这些因素中哪个最重要取决于您自己的要求(例如,后台任务并不总是需要最快的运行时间)。有些应用程序需要同时考虑两个因素,例如能耗和执行时间。“在这种情况下,C是最好的解决方案,因为它在这两个方面都表现出色,”研究人员说。如果你想在节省内存的同时节省时间,C、Pascal、Go语言都可以。如果您查看3个变量(时间、能量和内存使用),结论是相同的。但是,如果您只想在使用较少内存的同时节省能源,最好的选择是C或Pascal。
