以下十條「戒律」若照著做,將嚴重損害程式碼效能與擴展性。實際上,我們要做的正是「破壞」它們。以下逐條解析如何逆向優化。
記憶體分配昂貴,釋放更貴 (堆合併開銷)。NT 4.0 SP4 前多執行緒堆性能極差 (全域鎖)。對策:物件池、大塊分配、減少臨時物件。
現代 CPU 比 RAM 快數十倍。L1 快取命中 1 週期,L2 4-7 週期,主記憶體超過 100 週期。對策:陣列優於鏈表;將熱點資料打包進同一快取行 (32/64 位元組);唯讀與寫入資料分離快取行,避免「快取抖動」。
快取是時空權衡。伺服器偏重速度,可多快取,但必須設定淘汰策略 (LRU/TTL),防止記憶體耗盡導致分頁。
過多執行緒導致上下文切換風暴:切換本身無產出、清空 CPU 快取。對策:I/O 密集型用 IOCP/非同步 I/O;CPU 密集型限制執行緒數 ≈ CPU 核心數;採用 QueueUserWorkItem 等執行緒池模型。
單一鎖序列化所有存取,高負載下嚴重爭用。對策:資料分區加鎖 (如按首字母分表);Interlocked 系列原子操作;多讀單寫鎖;關鍵區段自旋計數;TryEnterCriticalSection 失敗做他事。
單核靠分時模擬並發,多核才是真並發,鎖/總線/快取行爭用只會在多核暴露。對策:開發階段即在多核機壓測,觀察 CPU 利用率與鎖爭用計數器。
同步 I/O 浪費百萬週期等待。對策:Overlapped I/O、IOCP、BeginRead/EndRead 模式;長耗時呼叫放入小型專用執行緒池排隊。
「無法用數字表達,就不算理解」。黑盒測量 (效能計數器、吞吐量) + Profiling (執行時間、呼叫頻率)。找到瓶頸根因而非表象,修正後必須回歸測試。
單瀏覽器測試只能發現功能 Bug。對策:模擬 10/100/1000 並發,觀察吞吐量、延遲、錯誤率;多核機上驗證擴展性。
針對實際流量分布 (靜態/動態比例、請求大小、連線模式) 優化。用戶與評論家會在真實場景評判你的系統。