能量使用數(shù)據(jù)是否能告訴我們編程語(yǔ)言的質(zhì)量?
六位來(lái)自葡萄牙三所大學(xué)的研究人員針對(duì)這一問(wèn)題進(jìn)行了研究,并發(fā)表了一篇名為《編程語(yǔ)言的能效》的論文。
他們使用27種不同的編程語(yǔ)言實(shí)現(xiàn)了10個(gè)問(wèn)題的解決方案(均采用相同算法),隨后執(zhí)行這些解決方案,并記錄了每種語(yǔ)言的電量消耗以及運(yùn)行速度和內(nèi)存占用情況,結(jié)果如圖示??
這項(xiàng)研究揭示了一些有趣的發(fā)現(xiàn):并非所有運(yùn)行速度快的編程語(yǔ)言都具有低能耗。
雖然C語(yǔ)言通常被認(rèn)為是速度最快的,并且在節(jié)能方面也表現(xiàn)優(yōu)異,但在對(duì)DNA數(shù)據(jù)庫(kù)進(jìn)行特定基因序列掃描的基準(zhǔn)測(cè)試中,Rust語(yǔ)言顯示出了更低的能耗,而C語(yǔ)言則排在第三位。
此外,"最佳"編程語(yǔ)言的評(píng)定標(biāo)準(zhǔn)也因測(cè)試的不同而異。例如,在一次測(cè)試中,C語(yǔ)言在內(nèi)存使用方面排名第二,而Rust排名第一;但如果按照內(nèi)存使用排序,Rust的排名會(huì)下降9位。
為了確保研究的可比性和代表性,研究者采用了Computer Language Benchmarks Game提供的10個(gè)標(biāo)準(zhǔn)算法問(wèn)題進(jìn)行測(cè)試。進(jìn)行各種基準(zhǔn)測(cè)試是至關(guān)重要的,因?yàn)椴煌臏y(cè)試會(huì)得出不同的結(jié)果。
總體來(lái)看,盡管C語(yǔ)言在速度和節(jié)能方面通常被認(rèn)為是最優(yōu)的,但在涉及掃描 DNA 數(shù)據(jù)庫(kù)中特定基因序列的基準(zhǔn)測(cè)試中,Rust 是最節(jié)能的,而 C 語(yǔ)言位居第三。
運(yùn)行速度快的語(yǔ)言更節(jié)能嗎?
雖然普遍認(rèn)為程序運(yùn)行速度的提升可以降低能耗,但研究者們明確指出,"并非所有運(yùn)行速度快的語(yǔ)言都更節(jié)能"。
研究者們通過(guò)分析實(shí)驗(yàn)結(jié)果,得出了一個(gè)結(jié)論:CPU消耗了大部分能量,大約平均占 88%。
此外,他們還發(fā)現(xiàn) DRAM 的峰值使用量與能耗之間幾乎沒(méi)有直接聯(lián)系。這項(xiàng)研究為一個(gè)長(zhǎng)期存在的問(wèn)題提供了解答:"速度更快是否意味著更環(huán)保?"
是的,當(dāng)按照?qǐng)?zhí)行時(shí)間排序時(shí),前5名最節(jié)能的語(yǔ)言在能源效率上也幾乎一致。
實(shí)際上,在10個(gè)基準(zhǔn)測(cè)試中,有9 項(xiàng)測(cè)試的最優(yōu)結(jié)果是由速度最快且能源效率最高的三種語(yǔ)言之一獲得的,這并不出乎研究者們的預(yù)料。
眾所周知,C、C++ 和 Rust 這三種語(yǔ)言因其高度優(yōu)化而在執(zhí)行性能上表現(xiàn)出色。
然而,當(dāng)對(duì)其他24種語(yǔ)言按照運(yùn)行時(shí)間進(jìn)行排名時(shí),情況則有所不同。只有OCaml、Haskell、Racket和Python這四種語(yǔ)言在能耗和時(shí)間排名上保持一致,而其他語(yǔ)言的排名則出現(xiàn)了較大差異。
即便在單一基準(zhǔn)測(cè)試中,也存在一些速度快但并不節(jié)能的語(yǔ)言。
編譯型語(yǔ)言的優(yōu)點(diǎn)
編譯型語(yǔ)言似乎是最節(jié)能和運(yùn)行最快的語(yǔ)言,這一點(diǎn)在論文中通過(guò)具體的數(shù)據(jù)得到了量化。
根據(jù)研究,編譯語(yǔ)言需要花費(fèi)120J能量來(lái)運(yùn)行解決方案,而虛擬機(jī)和解釋型語(yǔ)言要分別花費(fèi)576J和2365J。
在執(zhí)行時(shí)間的對(duì)比上,研究者也采用了相同的精度,得出的結(jié)論是:平均而言,編譯語(yǔ)言花費(fèi)5103毫秒,虛擬機(jī)語(yǔ)言花費(fèi)20623毫秒,解釋型語(yǔ)言花費(fèi)87614毫秒。
兩項(xiàng)排名中的前4名均為編譯型語(yǔ)言(有一個(gè)例外,Java語(yǔ)言)。
5種最慢的語(yǔ)言都是解釋型語(yǔ)言:Lua、Python、Perl、Ruby和Typescript。
5種能耗最多的語(yǔ)言也都是解釋型語(yǔ)言:Perl、Python、Ruby、JRuby和Lua。
但同時(shí),在使用正則表達(dá)式操作字符串時(shí),5種最節(jié)能的語(yǔ)言中有三種(TypeScript、JavaScript和PHP)是解釋型語(yǔ)言。盡管在其他情況下,它們往往不是很節(jié)能。
編譯型語(yǔ)言在占用內(nèi)存最少的排名中也占據(jù)了前5名。
研究者指出,平均內(nèi)存使用量方面,編譯語(yǔ)言為125Mb,虛擬機(jī)語(yǔ)言為285Mb,解釋語(yǔ)言為426Mb。
4種解釋型語(yǔ)言內(nèi)存消耗最高。
按編程范式排序,命令式語(yǔ)言平均使用116Mb,面向?qū)ο笳Z(yǔ)言249Mb,函數(shù)式語(yǔ)言251Mb,腳本421Mb。
命令式編程在能源消耗和運(yùn)行速度上通常優(yōu)于其他范式。
研究者強(qiáng)調(diào),編程范式和語(yǔ)言對(duì)能耗、時(shí)間和內(nèi)存的影響各異,且重要性取決于具體需求。
例如,后臺(tái)任務(wù)可能不需要極速運(yùn)行。某些應(yīng)用需同時(shí)考慮能耗和時(shí)間,C語(yǔ)言在這兩方面表現(xiàn)優(yōu)異。
若要同時(shí)節(jié)省內(nèi)存和時(shí)間,C、Pascal和Go是合適選擇。若考慮時(shí)間、能耗和內(nèi)存三個(gè)因素,C和Pascal在節(jié)能且內(nèi)存使用少方面表現(xiàn)最佳。
原文鏈接:
https://greenlab.di.uminho.pt/wp-content/uploads/2017/10/sleFinal.pdf?utm_source=thenewstack&utm_medium=website&utm_campaign=platform