哪種程式語言最省電?以及,編程質量與耗電多少有關?

2024-06-30     書圈

來自公眾號:51CTO技術棧

編譯 | 伊風

來自公眾號:51CTO技術棧

編譯 | 伊風

能量使用數據是否能告訴我們程式語言的質量?

去年,來自葡萄牙三所不同大學的六名研究人員決定調查這個問題,最終發布了一篇題為《程式語言的能效》的論文。他們在運行用27種不同語言編寫的10個編程問題的解決方案時,監測了每種語言使用的電量、速度和內存使用情況。

更具體的說,他們使用了計算機語言基準遊戲(Computer Language Benchmarks Game)的10個問題,這是一個用於比較性能的自由軟體項目,包括一組標準的簡單算法問題以及運行測試的框架。(以前被稱為「大計算機語言對決」。)「這使我們能夠獲得一個可比較、有代表性且廣泛的程序集……以及編譯/執行選項和編譯器版本。」

進行各種基準測試是重要的,因為他們的結果最終取決於執行的測試。例如,總體上C語言被證明是最快且最節能的。但在涉及掃描DNA資料庫中特定基因序列的基準測試中,Rust是最節能的——而C排在第三位。

然而,即使在同一測試中,「最佳」語言也取決於你的標準。在該測試中,C也是第二快的語言(再一次排在Rust之後)。但如果按內存使用情況排序,Rust下降了整整九位。而Fortran是該測試中第二節能的語言,但按執行時間排序時也下降了六位。

更快的語言並不總是最節能的。

研究人員指出,他們「嚴格遵循」CLBG項目關於編譯器版本和最佳優化標誌的指南。使用Intel的Running Average Power Limit工具測量功耗,每個程序不僅執行一次,而是執行了10次,「以減少冷啟動和緩存效應的影響,並能夠分析測量結果的一致性,避免異常值。」(因此,他們報告說,「測量結果相當一致。」)為了增加一致性,所有測試都在運行Linux Ubuntu Server 16.10(內核版本4.8.0-22-generic)的台式機上進行,配有16GB RAM和3.20GHz Haswell Intel Core i5-4460 CPU。

在他們的論文中,研究人員指出了一些有趣的結果。

「平均而言,Lisp消耗的能量是C的2.27倍(131.34J),執行時間是C的2.44倍(4926.99ms),所需內存是Pascal的1.92倍(126.64Mb)。」

他們還比較了編譯語言與解釋語言的結果(還有一個單獨的類別是運行在虛擬機上的語言)。論文還包括了不同編程範式的比較——包括函數式編程和命令式編程,以及面向對象編程和腳本編程。

更快的語言是否更綠色?

論文仔細研究了一個常見的假設,即更快的程序總是使用更少的能量,指出這並不像物理定律那樣簡單:E(能量)= T(時間)x P(功率)。研究人員指出,這部分是因為功率不是以一致的速率消耗的,這可能影響了其他研究人員關於程序運行時間是否影響能量消耗的工作。(「關於這個問題的結論有時會有所不同……」)在他們的一個基準測試中,一個Chapel程序比一個等效的Pascal程序執行時間減少了55%,但該Pascal程序使用的能量卻少了10%。

因此,儘管人們普遍認為程序運行得更快能量消耗會減少,研究人員明確表示,「更快的語言並不總是最節能的。」

這可能是一個難以回答的問題,因為功耗受多種因素的影響(包括編譯器的質量和使用的庫)。但最終,研究人員甚至能夠根據功耗是由CPU還是DRAM消耗來分解能量消耗——得出結論,平均而言,無論基準程序是編譯的、解釋的還是在虛擬機上運行的,CPU消耗的功率大約占88%。

有趣的是,解釋語言顯示出比較大的變化,CPU有時消耗的功率高達92.90%,有時低至81.57%。

在研究結果後,研究人員還得出結論,DRAM峰值使用與能量消耗之間的關係「幾乎不存在」。

這項研究為一個長期存在的問題提供了一些見解:更快的語言是否更綠色?是的,事實是,「在前五個最節能的語言中,它們在按執行時間排序時保持了它們的排名,且能量和時間值之間的差異非常小。」

實際上,對於10個基準問題中的9個,最高得分(無論是速度還是能效)都來自於三種總體最快和最節能的語言之一——這並沒有讓研究人員感到驚訝。「眾所周知,這三種頂級語言(C、C++和Rust)被認為是高度優化且執行性能高效的,正如我們的數據所示。」

但當你按運行時間對其他24種語言進行排序時,你不會看到相同的順序,而按能效排序時也不會。「只有四種語言在能量和時間排名中保持一致(OCaml、Haskell、Racket和Python),而其餘的則完全被打亂。」

即使在單個基準測試中,也有快速執行的語言並不是最節能的情況。

編譯語言:又快又節能

還有其他有趣的結果。編譯語言「往往」是最節能和運行最快的——他們的論文甚至可以用一個數字量化這一差異。「平均而言,編譯語言執行解決方案所需的能量為120J,而對於虛擬機和解釋語言,這一值分別為576J和2365J。」

研究人員在比較執行時間時也應用了同樣的精確度,得出結論,平均而言,「編譯語言需要5103ms,虛擬機語言需要20623ms,解釋語言需要87614ms。」

在這兩個類別中,前五名語言中的四個是編譯的。(例外是Java。)

最慢的五種語言都是解釋的(interpreted):Lua、Python、Perl、Ruby和Type。而消耗能量最多的五種語言也是解釋的:Perl、Python、Ruby、JRuby和Lua。

對於Google的新程式語言Carbon使用了多少能量,目前還沒有定論。

但與此同時,在使用正則表達式操作字符串時,五種最節能的語言中有三種是解釋語言(Type、Java和PHP),儘管在其他場景中它們往往不太節能。

編譯語言還占據了所需內存空間最少的前五個位置。

「平均而言,編譯語言需要125Mb,虛擬機語言需要285Mb,解釋語言需要426Mb,」研究人員報告說。與此同時,解釋語言占據了內存空間消耗最多的五個位置中的四個:JRuby、Dart、Lua和Perl。(儘管Erlang不是一種解釋語言,但它也會出現在最底層五個位置中,介於Dart和Lua之間)。

「如果按其編程範式排序,命令式語言需要116Mb,面向對象語言需要249Mb,函數式語言需要251Mb,而腳本語言需要421Mb。」

實際上,在比較不同的範式時,命令式編程往往表現最佳。其基準程序平均使用的能量更少——運行速度也更快——比面向對象、函數式和腳本範式的基準程序。

但需要考慮的因素有很多。「顯然,不同的編程範式,甚至是同一範式內的語言,對能量消耗、時間和內存的影響完全不同,」研究人員寫道。然而,哪個因素最重要將取決於你的場景。(例如,後台任務不總是需要最快的運行時間。)

而且有些應用程式需要考慮兩個因素——例如,能量使用和執行時間。在這種情況下,「C是最佳解決方案,因為它在單一目標中都占優勢,」研究人員寫道。如果你想節省時間同時使用更少的內存,C、Pascal和Go「是等效的」——如果你關注所有三個變量(時間、能量使用和內存使用),也是如此。但如果你只是想節省能量同時使用更少的內存,你最好的選擇是C或Pascal。

寫在最後

在論文的最後,研究人員補充說,進一步的研究希望能夠檢查總內存使用隨時間的變化是否與能量消耗更好地相關聯。

他們在網上共享了他們的數據,建議這可以讓未來的研究人員更容易比較.NET語言或JVM語言。對於使用移動應用程式、物聯網系統或其他從有限電源中汲取能量的應用程式的開發人員來說,功耗是一個主要關注點。

但最終,這項研究可能也會讓程式設計師們感到他們最討厭的東西:模糊性。研究人員報告說,如果你在尋找一種最好的程式語言,「這個問題沒有具體和最終的答案。

「儘管每個基準中最節能的語言幾乎總是最快的那一個,但事實是,沒有一種語言始終優於其他語言,」研究人員總結道。「使用一種語言的情況是確定該語言是否是最節能選擇的核心方面。」

參考連結:

https://thenewstack.io/which-programming-languages-use-the-least-electricity/

文章來源: https://twgreatdaily.com/65c68d980b2599a6dfa07d5dbcd6702c.html