編譯 | 伊風(fēng)
出品 | 51CTO技術(shù)棧(微信號:blog51cto)
能量使用數(shù)據(jù)是否能告訴我們編程語言的質(zhì)量?
圖片
去年,來自葡萄牙三所不同大學(xué)的六名研究人員決定調(diào)查這個(gè)問題,最終發(fā)布了一篇題為《編程語言的能效》的論文。他們在運(yùn)行用27種不同語言編寫的10個(gè)編程問題的解決方案時(shí),監(jiān)測了每種語言使用的電量、速度和內(nèi)存使用情況。
圖片
更具體的說,他們使用了計(jì)算機(jī)語言基準(zhǔn)游戲(Computer Language Benchmarks Game)的10個(gè)問題,這是一個(gè)用于比較性能的自由軟件項(xiàng)目,包括一組標(biāo)準(zhǔn)的簡單算法問題以及運(yùn)行測試的框架。(以前被稱為“大計(jì)算機(jī)語言對決”。)“這使我們能夠獲得一個(gè)可比較、有代表性且廣泛的程序集……以及編譯/執(zhí)行選項(xiàng)和編譯器版本?!?/p>
進(jìn)行各種基準(zhǔn)測試是重要的,因?yàn)樗麄兊慕Y(jié)果最終取決于執(zhí)行的測試。例如,總體上C語言被證明是最快且最節(jié)能的。但在涉及掃描DNA數(shù)據(jù)庫中特定基因序列的基準(zhǔn)測試中,Rust是最節(jié)能的——而C排在第三位。
然而,即使在同一測試中,“最佳”語言也取決于你的標(biāo)準(zhǔn)。在該測試中,C也是第二快的語言(再一次排在Rust之后)。但如果按內(nèi)存使用情況排序,Rust下降了整整九位。而Fortran是該測試中第二節(jié)能的語言,但按執(zhí)行時(shí)間排序時(shí)也下降了六位。
更快的語言并不總是最節(jié)能的。
研究人員指出,他們“嚴(yán)格遵循”CLBG項(xiàng)目關(guān)于編譯器版本和最佳優(yōu)化標(biāo)志的指南。使用Intel的Running Average Power Limit工具測量功耗,每個(gè)程序不僅執(zhí)行一次,而是執(zhí)行了10次,“以減少冷啟動(dòng)和緩存效應(yīng)的影響,并能夠分析測量結(jié)果的一致性,避免異常值。”(因此,他們報(bào)告說,“測量結(jié)果相當(dāng)一致。”)為了增加一致性,所有測試都在運(yùn)行Linux Ubuntu Server 16.10(內(nèi)核版本4.8.0-22-generic)的臺(tái)式機(jī)上進(jìn)行,配有16GB RAM和3.20GHz Haswell Intel Core i5-4460 CPU。
在他們的論文中,研究人員指出了一些有趣的結(jié)果。
“平均而言,Lisp消耗的能量是C的2.27倍(131.34J),執(zhí)行時(shí)間是C的2.44倍(4926.99ms),所需內(nèi)存是Pascal的1.92倍(126.64Mb)?!?/p>
他們還比較了編譯語言與解釋語言的結(jié)果(還有一個(gè)單獨(dú)的類別是運(yùn)行在虛擬機(jī)上的語言)。論文還包括了不同編程范式的比較——包括函數(shù)式編程和命令式編程,以及面向?qū)ο缶幊毯湍_本編程。
1.更快的語言是否更綠色?
論文仔細(xì)研究了一個(gè)常見的假設(shè),即更快的程序總是使用更少的能量,指出這并不像物理定律那樣簡單:E(能量)= T(時(shí)間)x P(功率)。研究人員指出,這部分是因?yàn)楣β什皇且砸恢碌乃俾氏牡?,這可能影響了其他研究人員關(guān)于程序運(yùn)行時(shí)間是否影響能量消耗的工作。(“關(guān)于這個(gè)問題的結(jié)論有時(shí)會(huì)有所不同……”)在他們的一個(gè)基準(zhǔn)測試中,一個(gè)Chapel程序比一個(gè)等效的Pascal程序執(zhí)行時(shí)間減少了55%,但該P(yáng)ascal程序使用的能量卻少了10%。
因此,盡管人們普遍認(rèn)為程序運(yùn)行得更快能量消耗會(huì)減少,研究人員明確表示,“更快的語言并不總是最節(jié)能的?!?/p>
這可能是一個(gè)難以回答的問題,因?yàn)楣氖芏喾N因素的影響(包括編譯器的質(zhì)量和使用的庫)。但最終,研究人員甚至能夠根據(jù)功耗是由CPU還是DRAM消耗來分解能量消耗——得出結(jié)論,平均而言,無論基準(zhǔn)程序是編譯的、解釋的還是在虛擬機(jī)上運(yùn)行的,CPU消耗的功率大約占88%。
有趣的是,解釋語言顯示出比較大的變化,CPU有時(shí)消耗的功率高達(dá)92.90%,有時(shí)低至81.57%。
在研究結(jié)果后,研究人員還得出結(jié)論,DRAM峰值使用與能量消耗之間的關(guān)系“幾乎不存在”。
這項(xiàng)研究為一個(gè)長期存在的問題提供了一些見解:更快的語言是否更綠色?是的,事實(shí)是,“在前五個(gè)最節(jié)能的語言中,它們在按執(zhí)行時(shí)間排序時(shí)保持了它們的排名,且能量和時(shí)間值之間的差異非常小?!?/p>
實(shí)際上,對于10個(gè)基準(zhǔn)問題中的9個(gè),最高得分(無論是速度還是能效)都來自于三種總體最快和最節(jié)能的語言之一——這并沒有讓研究人員感到驚訝。“眾所周知,這三種頂級語言(C、C++和Rust)被認(rèn)為是高度優(yōu)化且執(zhí)行性能高效的,正如我們的數(shù)據(jù)所示。”
但當(dāng)你按運(yùn)行時(shí)間對其他24種語言進(jìn)行排序時(shí),你不會(huì)看到相同的順序,而按能效排序時(shí)也不會(huì)?!爸挥兴姆N語言在能量和時(shí)間排名中保持一致(OCaml、Haskell、Racket和Python),而其余的則完全被打亂?!?/p>
即使在單個(gè)基準(zhǔn)測試中,也有快速執(zhí)行的語言并不是最節(jié)能的情況。
2.編譯語言:又快又節(jié)能
還有其他有趣的結(jié)果。編譯語言“往往”是最節(jié)能和運(yùn)行最快的——他們的論文甚至可以用一個(gè)數(shù)字量化這一差異?!捌骄?,編譯語言執(zhí)行解決方案所需的能量為120J,而對于虛擬機(jī)和解釋語言,這一值分別為576J和2365J?!?/p>
研究人員在比較執(zhí)行時(shí)間時(shí)也應(yīng)用了同樣的精確度,得出結(jié)論,平均而言,“編譯語言需要5103ms,虛擬機(jī)語言需要20623ms,解釋語言需要87614ms。”
在這兩個(gè)類別中,前五名語言中的四個(gè)是編譯的。(例外是Java。)
圖片
最慢的五種語言都是解釋的(interpreted):Lua、Python、Perl、Ruby和Typescript。而消耗能量最多的五種語言也是解釋的:Perl、Python、Ruby、JRuby和Lua。
對于Google的新編程語言Carbon使用了多少能量,目前還沒有定論。
但與此同時(shí),在使用正則表達(dá)式操作字符串時(shí),五種最節(jié)能的語言中有三種是解釋語言(TypeScript、JavaScript和PHP),盡管在其他場景中它們往往不太節(jié)能。
編譯語言還占據(jù)了所需內(nèi)存空間最少的前五個(gè)位置。
圖片
“平均而言,編譯語言需要125Mb,虛擬機(jī)語言需要285Mb,解釋語言需要426Mb,”研究人員報(bào)告說。與此同時(shí),解釋語言占據(jù)了內(nèi)存空間消耗最多的五個(gè)位置中的四個(gè):JRuby、Dart、Lua和Perl。(盡管Erlang不是一種解釋語言,但它也會(huì)出現(xiàn)在最底層五個(gè)位置中,介于Dart和Lua之間)。
“如果按其編程范式排序,命令式語言需要116Mb,面向?qū)ο笳Z言需要249Mb,函數(shù)式語言需要251Mb,而腳本語言需要421Mb?!?/p>
實(shí)際上,在比較不同的范式時(shí),命令式編程往往表現(xiàn)最佳。其基準(zhǔn)程序平均使用的能量更少——運(yùn)行速度也更快——比面向?qū)ο?、函?shù)式和腳本范式的基準(zhǔn)程序。
圖片
但需要考慮的因素有很多?!帮@然,不同的編程范式,甚至是同一范式內(nèi)的語言,對能量消耗、時(shí)間和內(nèi)存的影響完全不同,”研究人員寫道。然而,哪個(gè)因素最重要將取決于你的場景。(例如,后臺(tái)任務(wù)不總是需要最快的運(yùn)行時(shí)間。)
而且有些應(yīng)用程序需要考慮兩個(gè)因素——例如,能量使用和執(zhí)行時(shí)間。在這種情況下,“C是最佳解決方案,因?yàn)樗趩我荒繕?biāo)中都占優(yōu)勢,”研究人員寫道。如果你想節(jié)省時(shí)間同時(shí)使用更少的內(nèi)存,C、Pascal和Go“是等效的”——如果你關(guān)注所有三個(gè)變量(時(shí)間、能量使用和內(nèi)存使用),也是如此。但如果你只是想節(jié)省能量同時(shí)使用更少的內(nèi)存,你最好的選擇是C或Pascal。
圖片
3.寫在最后
在論文的最后,研究人員補(bǔ)充說,進(jìn)一步的研究希望能夠檢查總內(nèi)存使用隨時(shí)間的變化是否與能量消耗更好地相關(guān)聯(lián)。
他們在網(wǎng)上共享了他們的數(shù)據(jù),建議這可以讓未來的研究人員更容易比較.NET語言或JVM語言。對于使用移動(dòng)應(yīng)用程序、物聯(lián)網(wǎng)系統(tǒng)或其他從有限電源中汲取能量的應(yīng)用程序的開發(fā)人員來說,功耗是一個(gè)主要關(guān)注點(diǎn)。
但最終,這項(xiàng)研究可能也會(huì)讓程序員們感到他們最討厭的東西:模糊性。研究人員報(bào)告說,如果你在尋找一種最好的編程語言,“這個(gè)問題沒有具體和最終的答案。
“盡管每個(gè)基準(zhǔn)中最節(jié)能的語言幾乎總是最快的那一個(gè),但事實(shí)是,沒有一種語言始終優(yōu)于其他語言,”研究人員總結(jié)道?!笆褂靡环N語言的情況是確定該語言是否是最節(jié)能選擇的核心方面?!?/p>
參考鏈接:https://thenewstack.io/which-programming-languages-use-the-least-electricity/