網路流傳「程式碼越短效能越高」的觀點,聲稱減少語句、變數、判斷即是優化。這種片面認識極具誤導性。本文從演算法複雜度、實際資料特性、編譯器現實三個維度,系統駁斥此迷思並建立正確效能觀。
前提條件不存在:
1. 代碼非純順序執行(存在迴圈/遞歸),短代碼可能執行更多次。
2. 每行代碼開銷差異巨大(i++ vs 方法呼叫 vs I/O)。
高級語言不直接映射機器指令,**靜態代碼長度無法預測動態執行路徑**。
// 冒泡排序:代碼簡短 ~20 行,O(n²)
public void BubbleSort(int[] a) {
for (int i = a.Length-1; i >= 0; i--)
for (int j = 1; j <= i; j++)
if (a[j-1] > a[j]) Swap(ref a[j-1], ref a[j]);
}
// 快速排序:代碼較長 ~50 行,平均 O(n log n)
public void QuickSort(int[] a) => QuickSortInternal(a, 0, a.Length);
private void QuickSortInternal(int[] a, int l, int r) {
if (l >= r) return;
int p = Partition(a, l, r);
QuickSortInternal(a, l, p-1);
QuickSortInternal(a, p+1, r);
}
快排雖代碼較長、常數因子較大,但大數據量下**演算法複雜度優勢碾壓**冒泡。小數據量時快排常切換至插入排序(混合策略)。
qsort [] = []
qsort (x:xs) = qsort (filter (< x) xs) ++ [x] ++ qsort (filter (>= x) xs)
僅 2 行,但基於不可變鏈表,記憶體分配/複製開銷大,實際效能不如 C# 陣列原地排序。資料結構選擇往往比代碼長短更關鍵。
**選擇演算法必須結合具體業務場景測試,而非迷信理論複雜度。**
在演算法確定前提下,手動減少賦值/判斷:
- 效能增益通常 < 1%(編譯器已處理)
- 犧牲可讀性、可維護性
- 可能破壞編譯器優化假設(如 SSA 形式)
清晰、正確 > 微優化。除非 Profiling 確認熱點且證實有效,否則不應進行。
系列下篇將深入編譯器優化機制,揭示高級語言與機器碼的真實關係。