具有最快执行时间的软件不一定是最环保的。
利兰Teschler•执行主编
曾经有一种假设在计算机程序员中,一个更快的程序也是一个节能的程序。这个想法被转化为软件编程语言——当然更快的语言是更环保的,逻辑是这样的。
2017年,多亏了葡萄牙的一组研究人员,这一切都改变了。他们使用所谓的计算机语言基准游戏(CLBG)作为一种根据能源效率对软件语言进行排名的方式。CLBG是由程序员Doug Bagley在21世纪初提出的,它通过解决一系列众所周知的、多样化的编程问题,提出了一种运行、测试和比较软件的方法。最初设计CLBG是为了分析运行时性能,但葡萄牙研究人员意识到它也可以用于研究软件的能源效率。
他们的工作激发了计算机行业人士的想象力。2017年论文原文收到了很多关注和评论,以至于研究人员决定更新结果以反映自最初的研究开始以来,已被广泛使用的语言的能量效率。
CLBG涵盖了13个基准问题。它们包括在传递令牌时从线程切换到线程、搜索包装谜题的解决方案、对称线程集合请求、二叉树操作以及生成所谓的Mandelbrot-set可移植位图文件等任务。
葡萄牙研究人员收集了27种语言的能量消耗、执行时间和峰值内存使用情况的信息。为了测量能量消耗,研究人员使用了英特尔的运行平均功率限制(RAPL)工具,这是最新的英特尔处理器的一个功能,提供处理器的能量消耗。每个基准测试执行10次,这样做是为了减少冷启动和缓存效应的影响,并分析度量一致性。内存使用也是如此。
如您所料,编译语言通常是最快和最节能的。在最初的测试中,编译语言在执行测试用例时平均消耗120 J,而解释语言则达到2365 J。在执行时间方面出现了相同的趋势:编译语言平均需要5103 msec来运行基准测试,而解释语言则需要87,614 msec。
编程模式也对能源效率产生了影响。命令式语言——使用像C或fortran这样循序渐进的指令的语言——平均需要125j和5585毫秒。面向对象语言,如Java或c++——其中对象包含数据和代码,用于修改数据,平均消耗879 J,花费32,965 msec。函数式语言,如python——优化以处理符号计算和列表处理——平均消耗1367 J,执行基准测试花费42,740 msec。像javascript这样的脚本语言(其中高级构造每次解释和执行一个命令)在测试中平均消耗2320 J,花费88,322 msec。研究人员表示,基于cpu的能源消耗总是占能源消耗的大部分。平均而言,对于编译语言,这个值代表消耗的能量的88.94%,其余部分分配给DRAM。这意味着,优化程序以减少基于cpu的能量消耗也将减少与DRAM操作相关的能量。
然而,研究人员注意到,与编译语言(最小值为85.27%,最大值为91.75%)或虚拟机语言(最小值为86.10%,最大值为92.43%)相比,解释语言(最小值为81.57%,最大值为92.90%)的能耗数据有更多的可变性。
至于速度更快的语言是否总是最节能的?,it is interesting to note that the top four most energy efficient languages keep their rank when sorted by execution time and with very small differences in both energy and time values. Additionally, it is common knowledge that C,C++, and Rust are known to be heavily optimized and efficient for execution performance.
研究人员还评论了内存使用对内存能量消耗的影响。内存使用可以分为连续内存使用和峰值内存使用。研究人员得出结论,DRAM的能量消耗和峰值内存使用之间似乎没有一致的相关性。
考虑所有因素
语言评估带来的问题是,是否存在考虑到能量消耗、执行时间和峰值内存使用的“最佳”编程语言,如果没有,那么在每个给定的场景中,哪种语言是最佳的。为了比较同时使用多种质量的语言,研究人员使用一种被称为帕累托优化的多目标优化算法对它们进行排序。能量、时间和内存是优化目标。这个被称为帕累托最优解的解决方案,在某些情况下被证明使用了不止一种编程语言。此外,研究人员没有对去年获得的更新结果重新运行帕累托优化。
研究人员得出结论,只关心执行时间和能量消耗的开发人员几乎总是可以为工作选择最佳的语言。不幸的是,如果内存也是一个问题,那么语言的选择就不再是自动的了。开发人员必须决定在当前场景中哪些是最重要的品质。
最初的研究发现,C语言是整体上最节能的语言,Rust紧随其后。更新后的工作现在使Rust和C并列第一。在更新的结果中,更晦涩的语言表现得更突出。Julia是为数值分析而设计的,包含了用于并行计算的内置原语。OCaml具有函数式语言和面向对象语言的元素。Lisp是一种函数式编程语言,设计用于操作数据字符串。Haskell也是一种函数式编程语言,据说它擅长处理web后端等高负载并发应用程序。Chapel是由超级计算机制造商Cray开发的一种并行编程语言。GO是一种由谷歌开发的编译语言,它在语法上类似于C语言,但具有内存安全、垃圾收集和并发性。DW
你也可能喜欢:
了下:技术+产品,软件

