**提示：**呢篇文講嘅唔係**數學最佳化**。
**軟件最佳化**（粵拼：jyun5 gin2 zeoi3 gaai1 faa3；英文：**software optimization**）指將一隻軟件改到更加有效率，等個系統行起上嚟唔使用咁多系統資源。

簡單例子有檢查吓隻軟件嘅源碼，確保段源碼完全冇任何多餘（即係有同冇都唔會影響隻軟件嘅功效）嘅碼－想像家陣編寫緊一隻網上遊戲嘅程式，隻遊戲好受歡迎，有數以十萬計嘅玩家，如果個程式嘅源碼當中有一行多餘嘅碼，噉十萬幾位玩家玩起上嚟部伺服器就要行多十萬幾行多餘嘅碼，會搞到部伺服器嘅負責大咗好多。因為噉，最佳化喺實際嘅軟件工程工作上係一個相當受重視嘅課題。

以下嘅內容，假設讀者已經識嗮電腦程式編寫嘅基礎概念。

基礎概念
----

内文：軟件工程、編譯期同執行期
睇埋：效率同運算複雜度理論
軟件最佳化係軟件工程上嘅一樣重要工序：軟件（software）泛指用嚟做某啲特定功能嘅電腦程式，例如一隻電子遊戲就係一隻用嚟做娛樂用途嘅軟件；齋靠日常觀察就可知，部電腦要行一個電腦程式，梗要或多或少噉花啲時間同埋記憶體，而事實表明，一個寫程式嘅人寫程式嗰陣用嘅手法，會對「個程式要行幾耐先行得完」（睇埋編譯期同執行期等嘅概念）或者「個程式要用幾多記憶體」造成具體影響。

舉個簡單例子，想像家陣想寫個程式，個程式要攞個數 `a` 做 input，output 出嗮所有「細過或者等如 `a`、又係 10 嘅倍數」嘅數，即係

如果 `input` 係 200，就要出 `200, 190, 180, 170, 160,...` 噉嘅一列數；
如果 `input` 係 150，就要出 `150, 140, 130, 120, 110,...` 噉嘅一列數；
想像下面段虛擬碼：

```
 a = 200; *# 設 a 做 200*
 while (a > 0)  *# 可以睇埋 while 迴圈嘅概念。*
 {
   b = 10;
   if (a % b == 0} *# 如果 a 係 b 嘅倍數，print a 出嚟睇。*
     print(a);
   a -= 1; *# a 數值下降 1*
 }
```

上面段碼查實唔係咁有效率－`b = 10` 呢個步驟唔使喺個 while 迴圈每個圈度都行一次，而因為段碼有咗不必要嘅步驟，就搞到段碼行起上嚟慢咗。上面段碼可以改做：

```
 a = 200;
 **b = 10;**
 while (a > 0) 
 {  
   if (a % b == 0} 
     print(a);
   a -= 1;
 }
```

－`b = 10` 呢個步驟就變成淨係做一次咁多，令到段碼效率高咗。**軟件最佳化**指緊嘅就係：

|  |  |  |
| --- | --- | --- |
| 「 | 要減少一個程式消耗嘅資源量，當中『資源量』包括－
* 碼嘅數量、
* 行起上嚟嘥嘅時間，同埋
* 行起上嚟嘥嘅記憶體量，

同時保持個程式**功能唔變**。
 | 」 |

上面攞嚟做例子嗰個程式好簡單。就算做咗最佳化，齋靠肉眼睇唔多覺佢行得快咗。不過專業軟件工程上整嗰啲軟件，好多時閒閒哋成幾萬行碼咁長，有啲甚至仲有成上億行碼。對於噉嘅軟件嚟講，如果佢哋每 50 行碼就要嘥多 10 毫秒（1 毫秒 = 0.001 秒）行，已經會對佢實際用嗰陣嘅表現造成明顯影響。因為噉，專業嘅軟件工程師都相當關注最佳化嘅問題，會諗好多技巧想令啲程式更加有效率。

層面
--

### 演算法

内文：時間複雜度同空間複雜度
睇埋：窮舉搜尋
### 源碼

睇埋：麵條式程式碼同Debugging

強度折減
----

内文：強度折減

系統樽頸
----

内文：系統樽頸

缺點
--

睇埋：可讀性同代碼難讀化

最佳化好多時會令個程式嘅可讀性下跌。

睇埋
--

* 奧坎剃刀
* 優雅
* 複雜系統
* 記憶洩漏

文獻
--

* Abelson, H. & Sussman, G. J. (1996). *Structure and interpretation of computer programs*. The MIT Press.
* Gorelick, M. & Ozsvald, I. (2020). *High Performance Python: Practical Performant Programming for Humans*. O'Reilly Media.
* Code Optimization (PDF). *University of California, Davis*, Computer Science Lecture Notes.

攷
-

1. ↑  Wadleigh, K. R. & Crawford, I. L. (2000). *Software optimization for high-performance computing*. Prentice Hall Professional.
2. 1 2  Code Optimization (PDF). *University of California, Davis*, Computer Science Lecture Notes.
3. ↑  Lowry, E. S. & Medlock, C. W. (1969). Object code optimization (PDF). *Communications of the ACM*, 12(1), 13-22.
4. ↑  Code Optimization in Compiler Design. *GeeksForGeeks*. 1. Code Motion or Frequency Reduction, Example.
5. ↑  Performance Optimization in Software Development. *Medium*.
6. ↑  5 Most Complex Software Ever 互聯網檔案館嘅歸檔，歸檔日期2022年10月8號，.. *JavaScript in Plain English*.

拎
-

* Code Optimization in Compiler Design. *GeeksForGeeks*.

| * 睇
* 傾
* 改
軟件工程 |
| --- |
| 基本概念 | 
* 軟件（牟利 · 自由、開源同自由開源軟件）
* 電腦程式編寫（模塊化編程 · 程式編寫大綱）
* 終端用家
* 工程師

* 需求分析
* 軟件需求（功能同非功能需求）
* 分解
* 特徵蔓延
* 複製保護
* 系統分析
* SOLID 原則
* 防未來

 |  |
| 軟件質素 | 

|  |  |
| --- | --- |
| 軟件內部 | 
* 大細
* 可讀度（代碼難讀化）
* 可測試度
* 可維護度
* 可移植度
* 可返用度
* 可延伸度
* 容錯能力

 |
| 軟件外部 | 
* 效率
* 準確同精確
* 可靠度
* 頑健度
* 易用度

 |

 |
| 軟件開發 | 
* 項目管理
* 可行度研究（COCOMO）
* 設計（畫則 · 沙盤 · 設計模式 · 由上至下同由下至上）

* 寫程式工具（IDE）
* 建造（組建自動化）
* 最佳化
* 版本控制
* 原型同組建
* 測試（Debug · 除錯器）
* 驗證

* 軟件版本週期
* 易用度檢測同測試
* 維護（考古）
* 移植
* 國際化同本地化
* 製作地獄

 |
| 開發模型 | 
* 瀑布模型
* 螺旋模型
* 增進建造
* 疊代增進
* RAD
* 敏捷（Scrum · 看板 · 極限編程）
* V-模型

 |
| 相關領域 | 
* 形式化方法
* 電腦架構
* 電腦保安
* 人機互動
* 電子遊戲製作
* Apps
* 系統工程
* 資訊系統
* 項目管理

 |
| 軟件工程類 |