來源:Digi-Key 作者:Lee Teschler 過去,在微處理器芯片剛剛問世的黑暗時代,工科大學生往往是在 DEC PDP-11 小型計算機等機器上首次嘗試正經的計算機編程。除了盡力編寫能夠在 PDP-11 上正確運行的程序外,當時的學生還必須保證他們編寫的代碼緊湊。在早期計算機課程中,有一種情況會激怒老師,那就是提交一個本來用 15 行代碼就可以完成的 20 行匯編碼程序。他們出現這樣的反應當然不是沒有理由,因為當時的內存非常昂貴。PDP-11 的讀/寫存儲器通常只能存儲 4,096 個 16 位字,該存儲器由 22 密耳磁芯組成,這些磁芯通過導線進行訪問。 ![]() Digital Equipment Corporation (DEC) 的 PDP-11 計算機。(圖片來源:flickr) 時至今日,您會發現編程課程仍然強調代碼緊湊的重要性。但有跡象表明,編程課程可能很快就不再只是要求編寫緊湊代碼,而是還會要求編寫能耗最低的軟件。 計算機代碼能效曾經是一個小眾話題。以前主要是小型嵌入式系統的程序員對其感興趣,因為在這類系統中,必須關注 MCU 的功耗,目的是最大限度地延長供電紐扣電池的壽命,F如今,軟件能效正在占據主流。越來越多的智能手機用戶避免使用計算密集型應用程序,只為了多節省一點電量。甚至基于云的系統也會注重軟件能效,因為它會影響數據中心的碳排放。 乍看之下,您可能會覺得緊湊代碼已經很節能。事實證明,這條經驗法則有時正確,但并非總是如此。此外,計算機程序的能效通常取決于編寫程序所用的語言。編譯語言比解釋語言或編寫虛擬機的語言更節能。但即使看似相互關聯的編譯語言,能效也可能存在很大差異。 葡萄牙的研究人員深入分析了能源、時間和內存使用與節能編程之間的關系 (https://dl.acm.org/doi/10.1145/3136014.3136031)。他們分析了 27 種軟件語言的能效性能。為此,他們使用了最先進的編譯器、解釋器和虛擬機,并觀察了運行 13 個不同程序時發生的情況,利用這些程序比較了廣泛使用的算法采用各種常用編程語言時的實現情況。 例如,用某個基準程序計算系統中多個粒子之間相互作用所需的時間。用另一個基準程序分配和釋放大量二叉樹。再用一個基準程序更新哈希表,并用該表來計算特定的 DNA 核苷酸序列。 研究人員發現,人們往往誤以為軟件的能耗與執行時間成正比:運行越快一定越好。由此認為,縮短程序的執行時間將會減少相同比例的能耗。但這種關系并不一定這么簡單,因為能耗是所用功率與持續時間的乘積。因此,如果更快的程序在執行時功耗更高,則其不見得能效更高。 最終,研究人員在幾個實例中發現,編程語言的能耗排名與其執行時間的排名并不相同。例如,在涉及隨機 DNA 序列生成和寫入的基準測試中,Fortran 被證明是能效第二高的語言,但它在執行時間方面卻排在第八位。在計算二叉樹時,Pascal 和 Chapel 語言的能耗相差在 10% 以內,但 Chapel 的執行時間卻少了約 55%。 研究人員的一些結論并不令人驚訝。其中一項發現是:總體而言,C 語言最快且最節能(57 J,平均執行時間為 2,019 毫秒)。在 C 語言之后,執行基準測試所需能量和時間最少的四種語言分別是 Rust(59 J,2,103 毫秒)、C++(77 J,3,155 毫秒)、Ada(98 J,3,740 毫秒)和 Java (114 J,3,821 毫秒)。正如您所料,編譯語言比解釋語言或虛擬機語言更節能。編譯程序執行解決方案平均消耗 120 J,而虛擬機和解釋語言分別消耗 5,760 J 和 2,365 J。 毫無意外,能效和執行時間排在末位的五種語言均為解釋語言:能耗方面:Perl (4,604 J)、Python (4,390 J)、Ruby (4,045 J)、JRuby (2,693 J) 和 Lua (2,660 J);執行時間方面:Lua (16,7416 毫秒)、Python (14,5178 毫秒)、Perl (13,2856 毫秒)、Ruby (119,832 毫秒) 和 TypeScript (93,292 毫秒)。 研究人員還指出了大部分耗散能量的去向。基于 CPU 的能耗始終占所消耗能量的大多數。平均而言,無論編譯語言、解釋語言還是虛擬語言,CPU 能耗幾乎都高達 90%,其余為 DRAM 能耗。 總而言之,葡萄牙研究人員認為,如果開發人員只考慮執行時間和能耗,那么確定最佳軟件語言相對容易。但是,如果考慮內存使用因素,則無法不假思索地做出選擇。 因此,對于地球來說有一個好消息:可以通過優化軟件來提高能效。對于學習編程的學生而言有一個壞消息:現在,您不僅會因為提交的程序不夠緊湊而讓編程老師不悅,程序的能效低也會有同樣的結果。 |