附錄 A. 給程式設計師的提示

每本程式設計教科書都會提到記憶體分配的問題,以及一些函數的效能問題。因此在您撰寫軟體時,也請注意軟體執行時會增加的系統電力消耗量。雖然這考量並不及於每一行程式,但您還是可以在效能瓶頸之處多所著墨。
通常會出問題的技巧包括:
  • 使用執行續。
  • 不必要或沒效率地喚醒 CPU。如果真的必要喚醒 CPU,請一次(從 race 到 idle)、儘快完成。
  • 不必要地使用 [f]sync() 函數。
  • 不必要地啟用輪詢(polling)功能,或使用短暫、一定頻率的 timeout。(請只對事件做出回應。)
  • 沒效率地使用喚醒功能。
  • 沒效率地存取磁碟。請使用較大的緩衝區空間,以避免過度頻繁存取硬碟。一次寫入大空間的磁區。
  • 沒效率地使用計時器。可能的話,請跨應用程式(甚至跨系統)使用計時器。
  • 過度頻繁的 I/O、消耗電力、或使用記憶體(包括記憶體逸漏)
  • 進行不必要的運算。
以下章節會更進一步檢視這些內容。

A.1. 使用執行續

一般來說,使用執行續會讓應用程式更好、更快;但這不是每次都靈光。
Python

Python 使用了 Global Lock Interpreter[1],因此只有在大規模的 I/O 運作時,執行續才有其效用。Python 的 Unladen-swallow [2] 較快,更適用於程式碼最佳化。

Perl

Perl 的執行續一開始是給沒有 fork 功能的系統(例如 32 位元的 Windows 作業系統)之應用程式使用的。在 Perl 執行續裡,資料會複製給每個執行續(Copy On Write)。預設上,資料不會共享,因為使用者應該可以定義資料共享的等級。為了資料共享,threads::shared 模組已經包括在 Perl 裡面。然而,資料不但會被複製(Copy On Write),這模組還會為資料建立相關的變數,耗費更多時間,變得更慢。[3]

C

C 的執行續會共享同樣的記憶體,每個執行續都有自己的堆疊,kernel 不需要建立新的檔案描述或分配新的記憶體空間。C 可以善用多 CPU,執行多執行續。因此,要讓執行續的效能最大化,請使用較低階的語言,如 C 或 C++。如果您使用的是描述式語言,請考慮使用與 C 相關的語言。並使用剖析程式來找出程式中效能不彰的地方。[4]