本文经机器之心()授权转载,禁止二次转载
选自thenewstack,作者:DavidCassel,编辑:小舟、张倩
机器之心编译
在手机快没电时,管理软件往往会提醒我们关掉某些耗电量高的应用。可见,除了硬件厂商外,软件厂商也应该重视能耗问题。在这篇文章中,研究者分析了一下各种编程语言的能耗对比。
当能耗也成为了一个重要指标,我们要怎么选择编程语言?年,由6名葡萄牙研究者组成的团队决定对这一问题进行调查并发表了一篇名为《EnergyEfficiencyAcrossProgrammingLanguages》的论文。他们用27种语言写出了10个问题的解决方案(遵循同样的算法),然后运行这些方案,记录每种编程语言消耗的电量以及速度和内存使用情况,得到的排序结果如下图所示:通过这项研究,他们得出了一些有意思的结论,比如运行速度快的语言未必能耗小。在论文中,作者还根据编程语言的执行类型(编译、虚拟机或解释)和编程范式(命令式、函数式、面向对象和脚本)对结果进行了分析。具体而言,研究者使用了来自ComputerLanguageBenchmarksGame(一个用于比较性能的免费软件项目,其中包含一组标准的算法问题和用于运行测试的框架)的10个问题,使得研究更有可比性和代表性。运行各种基准测试非常重要,因为它们的结果会由于所执行的测试而有所不同。例如,总体而言,C语言被认为是最快的,也是最节能的。但是在涉及扫描DNA数据库中特定基因序列的基准测试中,Rust是最节能的,而C语言位居第三。即使在同一测试中,「最佳」语言也取决于你的标准。比如在一个C排第二、Rust排第一的测试中,如果按内存使用情况对结果进行排序,Rust会跌掉9个位次。而在一个Fortran能效第二高的测试中,如果结果按照运行时间排序,它也下降了6个位次。研究者指出,他们严格遵守CLBG项目关于编译器版本和最佳优化标志的指导方针。功耗的测量使用一个来自英特尔的工具——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),而其余语言则彻底散开。即使在单项基准测试中,也存在速度快但不节能的语言。编译型语言的优点编译型语言似乎是最节能和运行最快的语言,作者甚至可以在论文中用数字量化这种差异。平均而言,编译语言需要花费J能量来运行解决方案,而虚拟机和解释型语言要分别花费J和J。在比较执行时间时,研究者也采用了相同的精度,得出的结论是:平均而言,编译语言花费毫秒,虚拟机语言花费毫秒,解释型语言花费毫秒。两项排名中的前4名均为编译型语言(有一个例外,Java语言)。5种最慢的语言都是解释型语言:Lua、Python、Perl、Ruby和Typescript。5种能耗最多的语言也都是解释型语言:Perl、Python、Ruby、JRuby和Lua。但同时,在使用正则表达式操作字符串时,5种最节能的语言中有三种(TypeScript、JavaScript和PHP)是解释型语言。尽管在其他情况下,它们往往不是很节能。编译型语言在占用内存最少的排名中也占据了前5名。研究者称:「平均而言,编译语言需要Mb,虚拟机语言需要Mb,而解释语言则需要Mb。」具体来说,有4种解释型语言在这项排名中垫底,这意味着它们消耗了最多的内存空间。「如果按照它们的编程范式进行排序,命令式语言需要Mb,面向对象语言需要Mb,函数式编程语言是Mb,脚本需要Mb。」实际上,当比较不同范式时,命令式编程通常排在首位。与面向对象、函数式以及脚本范式的基准程序相比,命令式编程的基准程序平均使用的能源少得多,运行速度也更快。但是有很多因素需要考虑。研究者称「很显然,不同的编程范式,甚至同一范式中的语言对能耗、时间、内存的影响也完全不同」。但是,其中哪一个因素最重要取决于你自己的需求情况(例如,后台任务并不总是需要最快的运行时间)。某些应用程序需要同时考虑两个因素,如能耗和执行时间。研究者称:「在这样的情况下,C语言是最佳的解决方案,因为它在这两个方面都很有优势。」如果你想在节省内存的同时节省时间,那么C语言、Pascal和Go语言都可以。如果你正在观察3个变量(时间、能耗和内存使用情况),那么结论也是一样的。但是,如果你只是想在使用更少内存的同时节省能源,那么最好的选择是C语言或Pascal。参考链接: