能量使用数据是否能告诉我们编程语言的质量?
六位来自葡萄牙三所大学的研究人员针对这一问题进行了研究,并发表了一篇名为《编程语言的能效》的论文。
他们使用27种不同的编程语言实现了10个问题的解决方案(均采用相同算法),随后执行这些解决方案,并记录了每种语言的电量消耗以及运行速度和内存占用情况,结果如图示👇
这项研究揭示了一些有趣的发现:并非所有运行速度快的编程语言都具有低能耗。
虽然C语言通常被认为是速度最快的,并且在节能方面也表现优异,但在对DNA数据库进行特定基因序列扫描的基准测试中,Rust语言显示出了更低的能耗,而C语言则排在第三位。
此外,"最佳"编程语言的评定标准也因测试的不同而异。例如,在一次测试中,C语言在内存使用方面排名第二,而Rust排名第一;但如果按照内存使用排序,Rust的排名会下降9位。
为了确保研究的可比性和代表性,研究者采用了Computer Language Benchmarks Game提供的10个标准算法问题进行测试。进行各种基准测试是至关重要的,因为不同的测试会得出不同的结果。
总体来看,尽管C语言在速度和节能方面通常被认为是最优的,但在涉及扫描 DNA 数据库中特定基因序列的基准测试中,Rust 是最节能的,而 C 语言位居第三。
运行速度快的语言更节能吗?
虽然普遍认为程序运行速度的提升可以降低能耗,但研究者们明确指出,"并非所有运行速度快的语言都更节能"。
研究者们通过分析实验结果,得出了一个结论:CPU消耗了大部分能量,大约平均占 88%。
此外,他们还发现 DRAM 的峰值使用量与能耗之间几乎没有直接联系。这项研究为一个长期存在的问题提供了解答:"速度更快是否意味着更环保?"
是的,当按照执行时间排序时,前5名最节能的语言在能源效率上也几乎一致。
实际上,在10个基准测试中,有9 项测试的最优结果是由速度最快且能源效率最高的三种语言之一获得的,这并不出乎研究者们的预料。
众所周知,C、C++ 和 Rust 这三种语言因其高度优化而在执行性能上表现出色。
然而,当对其他24种语言按照运行时间进行排名时,情况则有所不同。只有OCaml、Haskell、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是合适选择。若考虑时间、能耗和内存三个因素,C和Pascal在节能且内存使用少方面表现最佳。
原文链接:
https://greenlab.di.uminho.pt/wp-content/uploads/2017/10/sleFinal.pdf?utm_source=thenewstack&utm_medium=website&utm_campaign=platform