点击上方“大鱼机器人”,选择“置顶/星标公众号”

福利干货,第一时间送达!

在手机快没电时,管理软件往往会提醒我们关掉某些耗电量高的应用。可见,除了硬件厂商外,软件厂商也应该重视能耗问题。在这篇文章中,研究者分析了一下各种编程语言的能耗对比。

当能耗也成为了一个重要指标,我们要怎么选择编程语言?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)的台式机上运行。

01

运行速度快的语言更节能吗?

这篇论文认真地研究了一个普遍的假设:速度越快的程序消耗的能源就越少。研究者指出,其实,这并不像物理学定律 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),而其余语言则彻底散开。

即使在单项基准测试中,也存在速度快但不节能的语言。

02

编译型语言的优点

编译型语言似乎是最节能和运行最快的语言,作者甚至可以在论文中用数字量化这种差异。

平均而言,编译语言需要花费 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

-END-

整理文章为传播相关技术,版权归原作者所有 |

| 如有侵权,请联系删除 |

往期好文合集

C语言高效编程与代码优化

大牛们的C语言编程建议和技巧!

厉害了!华为继鸿蒙OS后,即将发布国产编程语言,打破国外垄断!

最 后

若觉得文章不错,转发分享,也是我们继续更新的动力。

5T资源大放送!包括但不限于:C/C++,Linux,Python,Java,PHP,人工智能,PCB、FPGA、DSP、labview、单片机、等等

在公众号内回复「更多资源」,即可免费获取,期待你的关注~

不同编程语言能耗不同?看这27种语言对比!相关推荐

  1. 哪种编程语言又快又省电?有人对比了27种语言

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 本文转自|OpenCV学堂 在手机快没电时,管理软件往往会提醒我们 ...

  2. c 语言 pthread_create_哪种编程语言又快又省电?有人对比了27种语言

    原标题:哪种编程语言又快又省电?有人对比了27种语言 本文经机器之心(微信公众号:almosthuman2014)授权转载,禁止二次转载 选自thenewstack,作者:David Cassel,编 ...

  3. 运行速度最快的计算机语言,哪种编程语言又快又省电?有人对比了27种语言

    选自thenewstack 作者:David Cassel 机器之心编译 编辑:小舟.张倩 在手机快没电时,管理软件往往会提醒我们关掉某些耗电量高的应用.可见,除了硬件厂商外,软件厂商也应该重视能耗问 ...

  4. 如果程序员是士兵,编程语言是武器,那么每种语言都是什么武器?

    PHP 3是电锯.是面向致力于web app的士兵的第一批武器之一(甚至在"web spp"这个名词变得流行之前).可以完成工作,但看起来很杂乱,幸运的是现在有更好的选择.(PHP ...

  5. 学会这27种编程语言,你还怕找不到女朋友?!那是要几个有几个!

    我就知道你们会点进来看对不对,为什么我会这么说呢?看完以下内容再私信小编,小编就告诉你. 27 种语言: 过程型编程语言: C, Rust, Cython 面向对象数据建模语言: Java, C#, ...

  6. 帮你提升Python的27种编程语言

    27 种语言 过程型编程语言: C, Rust, Cython 面向对象数据建模语言: Java, C#, Eiffel C 的面向对象衍生语言: C++, D 面向数组的数据处理: MATLAB/O ...

  7. Python和其它27种编程语言

    27 种语言 过程型编程语言: C, Rust, Cython 面向对象数据建模语言: Java, C#, Eiffel C 的面向对象衍生语言: C++, D 面向数组的数据处理: MATLAB/O ...

  8. Python AND 其它27种编程语言

    27 种语言 过程型编程语言: C, Rust, Cython 面向对象数据建模语言: Java, C#, Eiffel C 的面向对象衍生语言: C++, D 面向数组的数据处理: MATLAB/O ...

  9. (转)少儿编程这么火, 究竟学哪一种语言最靠谱?这篇文章说透了!

    http://www.sohu.com/a/251561825_124768 这几年,人工智能的发展速度与日俱增:AlphaGo赢了柯洁:百度无人巴士量产:Google的AI客服,用一个简单的&quo ...

最新文章

  1. 【深度学习】腹部CT的肝脏肿瘤分割的探索
  2. 快速排序 python菜鸟教程-Python菜鸟文本处理4种方法
  3. iOS 提交应用过程出现的错误及#解决方案#images can't contain alpha channels or transparencies...
  4. 基于Dockerfile 构建redis5.0.0(包括持久化)及RedisDestopManager 监控
  5. CreateBindGroupNode.txt
  6. java开发名言_程序员名言语录
  7. 热烈庆祝AC70道题
  8. Web-IM前端解决方案
  9. 中国移动MM7 API用户手册(七)
  10. 官方client php api接口日记
  11. ubuntu 16.04/14.04 ORK 在 Kinect v2和 Kinect v1的安装(物体位姿估计)
  12. 微波炉控制器的设计(EDA课程设计)
  13. 女士品茶 - 简单摘录
  14. RFID无线射频识别技术
  15. 【华为OD机试Python实现】HJ70 矩阵乘法计算量估算(中等)
  16. HDFS源码解析---Balancer
  17. 《锋利的jQuery》学习总结
  18. NVIDIA显卡驱动及CUDA相关安装流程(包括多版本cuda切换)
  19. 工业4.0革命袭来 传统工人会被机器人代替吗?
  20. 智能锁只需要一个MAC地址就可以打开

热门文章

  1. SAP UI5 Web Component的React表格控件用法
  2. How is ABAP keyword highlight implemented in Chrome
  3. customizing download - debug in CRM
  4. coach和mentor,教练和导师的区别
  5. 创建Live Rates Plan时Sales Organization无法自动带出来的问题
  6. 让product description 成为mandatory field
  7. 获得SAP CRM report的元数据get report detail(Metadata) via url
  8. Report not added to business roles
  9. SAP Fiori Launchpad pageSet请求的处理原理
  10. SAP CRM HANA report filter的工作原理