開發「鍵盤精靈」類功能:載入 20 萬筆文字資料(~10MB)至記憶體,依使用者輸入快速檢索最符合的 10 筆。初期載入 6 萬筆測試資料即佔用 70-80MB,目標大幅降低記憶體佔用。
問題:大量臨時集合與物件造成 GC 壓力、記憶體暴增。
效果:記憶體從 70-80MB 降至 30-40MB(降 50%+)。核心原則:**只保留最終需要的資料結構,中間過程零分配**。

string[] 優於自訂類別/結構(避免物件頭部開銷、參數傳遞複製)。.NET 執行時期(CLR、GC、物件頭)有固定記憶體開銷。同樣 10MB 文字資料:
string 載入佔 20-30MBstd::string/vector 僅佔 9-10MB,且幾無波動InitData、SetPriority、Search、UnloadData,核心邏輯以 STL 實現。DllImport 引入函式,StringBuilder 接收查詢結果字串。

StringBuilder 必須預先配置足夠容量(new StringBuilder(maxSize)),否則 C++ 寫入會拋異常。
資料載入記憶體穩定在 10MB 左右,滿足嚴格記憶體限制。
| 層次 | 手段 | 效果 |
|---|---|---|
| 1. 程式碼習慣 | 避免臨時物件、用值型別、減少靜態長存物件 | 消除不必要分配,降低 GC 壓力 |
| 2. 演算法/資料結構 | 固定容量集合、索引分桶、有序資料早期終止 | 從根本減少資料規模與掃描範圍 |
| 3. 執行時期認知 | 理解 CLR/GC/物件佈局/集合預分配機制 | 針對性避開隱性開銷 |
| 4. 混合編程 | 核心熱路徑移至 C/C++,P/Invoke 呼叫 | 獲得手動記憶體管理、極致記憶體密度 |
.NET 開發便利性來自 GC,但也容易讓開發者忽視記憶體成本。結合良好習慣、高效演算法、必要時混合非托管代碼,可在保留 .NET 生產力的同時,達到接近原生的記憶體效能。