当能耗也成为了一个主要指标,我们要怎么选择编程措辞?2017 年,由 6 名葡萄牙研究者组成的团队决定对这一问题进行调查并揭橥了一篇名为《Energy Efficiency Across Programming Languages》的论文。他们用 27 种措辞写出了 10 个问题的办理方案(遵照同样的算法),然后运行这些方案,记录每种编程措辞花费的电量以及速率和内存利用情形,得到的排序结果如下图所示:
通过这项研究,他们得出了一些故意思的结论,比如运行速率快的措辞未必能耗小。
在论文中,作者还根据编程措辞的实行类型(编译、虚拟机或阐明)和编程范式(命令式、函数式、面向工具和脚本)对结果进行了剖析。

详细而言,研究者利用了来自 Computer Language Benchmarks Game(一个用于比较性能的免费软件项目,个中包含一组标准的算法问题和用于运行测试的框架)的 10 个问题,使得研究更有可比性和代表性。
运行各种基准测试非常主要,由于它们的结果会由于所实行的测试而有所不同。例如,总体而言,C 措辞被认为是最快的,也是最节能的。但是在涉及扫描 DNA 数据库中特定基因序列的基准测试中,Rust 是最节能的,而 C 措辞位居第三。
纵然在同一测试中,「最佳」措辞也取决于你的标准。比如在一个 C 排第二、Rust 排第一的测试中,如果按内存利用情形对结果进行排序,Rust 会跌掉 9 个位次。而在一个 Fortran 能效第二高的测试中,如果结果按照运行韶光排序,它也低落了 6 个位次。
研究者指出,他们严格遵守 CLBG 项目关于编译器版本和最佳优化标志的辅导方针。功耗的丈量利用一个来自英特尔的工具——Running Average Power Limit,每个程序运行 10 遍。作者表示,「这是为了减少冷启动和缓存效应的影响,并能够剖析丈量的同等性,避免非常值」。
为了增强同等性,所有测试都在一个运行 Linux Ubuntu Server 16.10(内核版本 4.8.0-22-generic)的台式机上运行。
运行速率快的措辞更节能吗?
这篇论文负责地研究了一个普遍的假设:速率越快的程序花费的能源就越少。研究者指出,实在,这并不像物理学定律 E(nergy) = T(ime) x P(ower) 那么大略。这是由于电力并不按照一定的速率进行花费。在其他研究者的一项研究中,一个 Chapel 程序的运行韶光比另一个用 Pascal 写的等价程序少 55%,但丈量结果却表明,那个 Pascal 程序所用的能量反而要少 10%。
因此,只管普遍认为程序运行速率更快时能耗会低落,但研究者明确指出「速率更快的措辞并不总是更节能。」
这可能是一个很难回答的问题,由于功耗受到许多成分的影响(包括编译器的质量和利用的库)。但终极,研究职员总结出,无论是编译型措辞、阐明型措辞还是虚拟机,实在大部分能量(均匀 88% 旁边)是由 CPU 花费的。
在对实验结果剖析研究之后,研究者还得出结论:DRAM 的峰值利用量与能耗之间「险些没有关系」。该研究为一个长期存在的问题供应了答案:「速率更快就更环保吗?」是的,的确是这样,在按照实行韶光进行排序时,前 5 种最节能的措辞依然排在前 5 名,而且在能量和韶光值方面的差距很小。
实际上,在 10 个基准问题测试中,有 9 个得分最高者(速率和能源效率两方面)是速率最快和能源效率最高的三种措辞之一,这并没有让研究者感到惊异。众所周知,就像研究中的数据所显示的一样,C、C++ 和 Rust 这三种排名最靠前的措辞都经由了大量优化,在实行性能上都比较高效。
但是按照运行韶光对其他 24 种措辞进行排名时,情形就不一样了。只有 4 种措辞保持相同的能耗和韶光排名(OCaml、Haskel、Racket 和 Python),而别的措辞则彻底散开。
纵然在单项基准测试中,也存在速率快但不节能的措辞。
编译型措辞的优点
编译型措辞彷佛是最节能和运行最快的措辞,作者乃至可以在论文中用数字量化这种差异。
均匀而言,编译措辞须要花费 120J 能量来运行办理方案,而虚拟机和解释型措辞要分别花费 576J 和 2365J。
在比较实行韶光时,研究者也采取了相同的精度,得出的结论是:均匀而言,编译措辞花费 5103 毫秒,虚拟机措辞花费 20623 毫秒,阐明型措辞花费 87614 毫秒。
两项排名中的前 4 名均为编译型措辞(有一个例外,Java 措辞)。
5 种最慢的措辞都是阐明型措辞:Lua、Python、Perl、Ruby 和 Typescript。5 种能耗最多的措辞也都是阐明型措辞:Perl、Python、Ruby、JRuby 和 Lua。
但同时,在利用正则表达式操作字符串时,5 种最节能的措辞中有三种(TypeScript、JavaScript 和 PHP)是阐明型措辞。只管在其他情形下,它们每每不是很节能。
编译型措辞在占用内存最少的排名中也霸占了前 5 名。
研究者称:「均匀而言,编译措辞须要 125Mb,虚拟机措辞须要 285Mb,而阐明措辞则须要 426Mb。」详细来说,有 4 种阐明型措辞在这项排名中垫底,这意味着它们花费了最多的内存空间。
「如果按照它们的编程范式进行排序,命令式措辞须要 116Mb,面向工具措辞须要 249Mb,函数式编程措辞是 251Mb,脚本须要 421Mb。」
实际上,当比较不同范式时,命令式编程常日排在首位。与面向工具、函数式以及脚本范式的基准程序比较,命令式编程的基准程序均匀利用的能源少得多,运行速率也更快。
但是有很多成分须要考虑。研究者称「很显然,不同的编程范式,乃至同一范式中的措辞对能耗、韶光、内存的影响也完备不同」。但是,个中哪一个成分最主要取决于你自己的需求情形(例如,后台任务并不总是须要最快的运行韶光)。
某些运用程序须要同时考虑两个成分,如能耗和实行韶光。研究者称:「在这样的情形下,C 措辞是最佳的办理方案,由于它在这两个方面都很有上风。」如果你想在节省内存的同时节省韶光,那么 C 措辞、Pascal 和 Go 措辞都可以。如果你正在不雅观察 3 个变量(韶光、能耗和内存利用情形),那么结论也是一样的。但是,如果你只是想在利用更少内存的同时节省能源,那么最好的选择是 C 措辞或 Pascal。
参考链接:
https://thenewstack.io/which-programming-languages-use-the-least-electricity/
https://greenlab.di.uminho.pt/wp-content/uploads/2017/10/sleFinal.pdf?utm_source=thenewstack&utm_medium=website&utm_campaign=platform