前言
我們在撰寫程式時,除了程式運行正確外,還會希望程式品質更好。優化程式的目標有增加程式運行效率、減少程式體積、減少程式記憶體用量等。除此之外,程式耗能少也是考量之一。在相同的運算過程下,如果能用更少的能量來完成,就是較環保的程式語言。
在手持裝置、嵌入式裝置等資源受限的裝置中,節能是重要的考量。當裝置上的程式更節能,裝置就可以運行更久。本文從節能環保的觀點來比較程式語言,讓讀者在選擇程式語言時,多一個參考的依據。
出處
本篇文章所引用的資料主要是來自某個葡萄牙的研究團隊所做的兩篇研討會論文:
- Towards a Green Ranking for Programming Languages
- Energy Efficiency across Programming Languages
筆者沒有辦法取得付費的 SCI impact factor 資料庫的使用權限。根據一些免費的資料庫查詢的結果,這兩篇應該都沒有 SCI 點數。
如果時間不夠,可以看第二篇就好,或是直接看本文所整理出來的結論。
評估方式
使用以下算式來評估:
總能量 = 耗能 x 時間
基本上,越環保的語言消耗總能量越低。測量程式運行的時間不會太困難。但耗能比較難取得:
- 耗能不是常數
- 耗能主要來自處理器 (CPU) 運算
- 使用記憶體也會消耗一些能量
- 我們無法直接從程式碼算出耗能,只能用工具量測實際的程式
該研究的程式碼取自於知名程式語言 benchmark 網站 Computer Language Benchmarks Game 的範例程式碼。
影響程式耗能的因素
影響程式耗能的因素很多,以下列出一些常見的因素:
- 宿主硬體
- 程式的格式 (機械碼、位元碼、命令稿)
- 程式的運算方式 (演算法)
- 優化程式的方式
- 虛擬機器的實作方式
- 直譯器的實作方式
- 處理的資料量大小
以該研究來說,觀察的因素是程式語言。程式語言的實作會影響程式的格式、虛擬機器的實作、直譯器的實作等。由於這些因素在程式語言實作中不易區隔開來,可以把這些因素統整起來,當成一個複合因素。
研究結論
從耗能和運行時間等面向來看,最環保的程式語言是 C 語言。這樣的結果不會很意外,因為 C 語言本來就是在組合語外最貼近電腦程式的高階語言。在所有高階語言中,C 語言的抽象化程度是最少的,所以可以轉換成體積小、效能高的電腦程式。
在該研究的結果中,整體節能程度的前五名是 C、Rust、C++、Ada、Java。值得注意的是 Java 不是編譯語言,但節能程度比 Golang 還好。此外,在不同的 benchmark 中,最節能的語言會變動,不會有單一語言在所有項目都是最節能的。
相對來說,整體節能程度吊車尾的後五名是 Perl、Python、Ruby、JRuby、Lua,剛好都是直譯語言。此處的 Lua 是官方的實作版本,而非 LuaJIT。
在節省記憶體方面,前五名是 Pascal、Golang、C、Fortran、C++。要注意和節能的排名相異。
在語言實作方面,節能程度是編譯語言 (compiled language) 大於虛擬機器語言 (virtual-machine based language) 大於直譯語言 (interpreted language)。這也是在意料中的事。
在程式範式 (programming paradigm) 方面,節能程度是命令式語言 (imperative language) 大於物件導向式語言 (objective-oriented language) 大於函數式語言 (functional language) 大於腳本語言 (scripting language)。函數式語言比較不節能的可能原因是遞迴的開銷大於迭代。
如果要同時考量節能、效能好、省記憶體,我們無法直接決定那個語言是最佳選擇,只能選出相對好的語言。
結語
選擇程式語言有很多考量,不是單靠少數幾篇研討論論文就能決定的。本研究最大的意義在於讓程式設計者意識到電腦程式是要耗能的,在選擇程式語言時能夠考慮到節能這個面向。