精簡程式碼與高能效軟體
過去,在微處理器晶片剛問世的黑暗時代中,工科大學生一般都是在 DEC PDP-11 微型電腦上,首次實際嚐到編寫電腦程式的滋味。除了嘗試編寫可實際在 PDP-11 正確執行的程式以外,那時的學生還必須讓程式碼精簡化。在早期電腦課程中,若你用 20 行寫出一個 15 行就能搞定的組合語言程式碼,交到老師手上的時候,他的臉色一定很難看。他們會有這樣的反應當然不是沒理由的,因為當時的記憶體相當昂貴。PDP-11 的讀/寫記憶體中通常只有 4,096 個 16 位元字,而記憶體則是由 22 mil 的磁芯所組成,並以導線加以存取。
Digital Equipment Corporation (DEC) 的 PDP-11 電腦。(圖片來源:flickr)
時至今日,你會發現程式設計課程仍要求程式碼精簡化。但是種種跡象顯示,這些課程很快就不僅會要求程式碼精簡化,還會要求軟體盡可能達到最低能耗。
電腦程式碼的能源效率課題,在過去只有少數人關心。這主要是小型嵌入式系統程式設計人員關注的事項,因為在這類系統中,他們必須持續關注 MCU 的功率耗散,以便讓提供電力的鈕釦型電池達到最大續航力。現在,軟體能效也成為關注焦點。智慧型手機使用者為了讓手機電池發揮更長續航力,逐漸避免使用 CPU 密集的應用程式。即使是雲端系統也會注意軟體能效,因為這會對資料中心的碳排放量造成影響。
乍看之下,你可能會猜想,精簡的程式碼已經可以減少能耗。事實證明,此經驗法則有時候有用,但有時不可行。此外,電腦程式的能效通常取決於編寫的程式語言。比起直譯式語言或編寫虛擬機器的語言,編譯式語言的能效更高。但是,即使各種編譯式語言之間看似相關,能效也可能有很大的差異。
葡萄牙的研究人員針對能源、時間與記憶體的使用,研究其與程式設計能效之間的關係 (https://dl.acm.org/doi/10.1145/3136014.3136031)。研究人員分析了 27 種軟體語言的能效表現。為此,他們使用最先進的編譯器、直譯器和虛擬機器,並觀察執行 13 種不同程式時所發生的情況;會以常用的演算法,比較其在多個常見的程式語言中的實作情況為何。
比如說,有個基準程式會計算系統中多個粒子之間相互作用所需的時間;另一個則負責分配和解除分配大量二元樹;第三個則會更新一個雜湊表,並用來計算特定的 DNA 核苷酸序列。
研究人員發現,人們往往誤以為軟體的耗能與執行時間成正比,也就是說「執行越快一定更好」。因此,減少程式執行時間,就會以同樣的比例降低能耗。但這種關係不一定只是因為消耗的能量,是使用的功率和持續時間的乘積而已。因此,若程式在執行過程中消耗更多電力,則速度更快的程式未必更高能效。
所以,研究人員在幾個實例中發現,程式設計語言的能源消耗排名,與執行時間的排名不同。例如,在涉及產生和寫入隨機 DNA 序列的基準程式中,Fortran 是第二高能效的語言,但在執行時間上卻排名第八。在計算二元樹時,Pascal 和 Chapel 語言的耗能彼此相差 10% 以內,但 Chapel 的執行時間大約減少了 55%。
研究人員得到一些結論,結果並不令人意外。其中一個發現是:整體而言,C 語言是最快且能效最高的語言 (57 J,平均執行時間為 2,019 ms)。排在 C 語言之後,執行基準程式耗費最少能量和時間的前四種語言是 Rust (59 J、2,103 ms)、C++ (77 J、3,155 ms)、Ada (98 J、3, 740 ms) 和 Java (114 J、3,821 ms)。也許你已經心裡有數了,編譯式語言比直譯式語言或虛擬機語言具備更高的能效。編譯程式執行解法的平均耗能為 120 J,而虛擬機器和直譯式語言則分別耗用 5,760 J 和 2,365 J。
因此在能效和執行時間方面,墊底的五種程式語言,都是直譯式。能效層面:Perl (4,604 J)、Python (4,390 J)、Ruby (4045 J)、JRuby (2,693 J) 和 Lua (2,660 J);時間層面:Lua (16,7416 ms)、Python (14,5178 ms)、Perl (13,2856 ms)、Ruby (119,832 ms) 和 TypeScript (93,292 ms)。
研究人員也指出大部分耗散能源的流向。CPU 方面的能源消耗,始終是最大宗。平均而言,CPU 消耗了將近 90% 的能源,其餘能源則由 DRAM 耗盡,且無論是編譯式、直譯式還是虛擬語言,全都是如此。
綜上所述,葡萄牙研究人員指出,如果開發人員只關心執行時間和耗能,那麼最佳的軟體語言便能高下立判。但如果將記憶體使用量納入考量,結果就未必如此。
因此,對地球來說有一個好消息:透過軟體最佳化提高能效是可行的。但是,對於學習程式設計的學生來說,則有個壞消息:如果你不想看到老師擺出一副難看的臉色,現在你交的程式不但要精簡,還得具備高能效才行。

Have questions or comments? Continue the conversation on TechForum, Digi-Key's online community and technical resource.
Visit TechForum