精簡程式碼與高能效軟體

過去,在微處理器晶片剛問世的黑暗時代中,工科大學生一般都是在 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 耗盡,且無論是編譯式、直譯式還是虛擬語言,全都是如此。

綜上所述,葡萄牙研究人員指出,如果開發人員只關心執行時間和耗能,那麼最佳的軟體語言便能高下立判。但如果將記憶體使用量納入考量,結果就未必如此。

因此,對地球來說有一個好消息:透過軟體最佳化提高能效是可行的。但是,對於學習程式設計的學生來說,則有個壞消息:如果你不想看到老師擺出一副難看的臉色,現在你交的程式不但要精簡,還得具備高能效才行。

關於作者

Image of Lee Teschler

Lee Teschler 是 Design World 網站、線上資源和印刷出版物網路的執行編輯。Leland (Lee) Teschler 在 Penton Media 任職 37 年,自 1977 年起擔任 Machine Design 的特約編輯,並在 2006 年晉升為該出版物的總編輯。在此之前,他曾是聯邦政府的通訊工程師。Teschler 擁有美國密西根大學的工程學士學位和電機工程學士學位,以及克利夫蘭州立大學的 MBA 學位。

More posts by Lee Teschler
 TechForum

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

Visit TechForum