多核心時代,單執行緒效能提升有限,開發者必須善用平行機制。Visual Studio 2010 內建 Concurrency Visualizer,大幅降低平行效能分析門檻,並能協助發現序列化程式的平行化潛力。
三大核心視圖
1. CPU 利用率視圖
- X 軸:時間;Y 軸:邏輯核心數 (含超執行緒)。
- 綠色:目標程式平均使用核心數;灰色:閒置;紅色:系統程序;黃色:其他程序干擾。
- 用途: 找出序列化熱點 (長條綠色單核)、CPU 利用率低 (可能阻塞)、外部干擾。
2. 執行緒視圖
包含時間軸、活動圖例、報告/詳細資料三區塊。
- 磁碟通道 (頂部): 顯示讀寫作業延遲,點選可查看檔案名稱與呼叫堆疊。
- 執行緒通道: 以顏色區分狀態:綠色(執行)、紅色(同步阻塞)、黃色(搶佔)、藍色(睡眠)、紫色(分頁/記憶體)、青色(I/O)、橘色(UI 處理)。
- 關鍵功能: 點選阻塞區段可見「目前堆疊」與「取消阻塞堆疊」,連線指示哪個執行緒釋放鎖定,快速定位同步爭用。
3. 核心視圖
- 顯示各執行緒在各邏輯核心上的排程分布,統計上下文切換與核心遷移次數。
- 協助判斷是否需設定處理器親和性,或優化鎖競爭減少切換。
豐富報告功能
- 取樣分析報告: 依包含/排除成本排序熱門呼叫路徑,支援「Just My Code」與雜訊過濾。
- 阻塞分析報告: 依阻塞類別統計等待時間與次數,直指同步、I/O、分頁等瓶頸。
- 檔案作業報告: 彙總各檔案讀寫位元組數、延遲、存取執行緒。
- 每執行緒摘要: 長條圖呈現各執行緒狀態比例,追蹤優化進度。
支援現代平行程式庫
- PPL (parallel_for): 需呼叫
Concurrency::EnableTracing() / DisableTracing()。
- TPL (Parallel.For) 與 PLINQ: 內建支援,自動標記平行區塊。
資料收集與符號設定
- 透過「效能精靈」選擇「並行」分析法,或命令列工具
VSPerfCmd 收集 ETW 追蹤 (需管理員權限)。
- 建議啟用 Microsoft 公開符號伺服器並設定符號快取,加速堆疊解析。
- 收集時間建議控制在 1-2 分鐘,避免追蹤檔過大導致分析緩慢。
Scenario 標記庫:自訂階段視覺化
引用 Scenario.h,在程式碼呼叫 Begin/End 標記階段 (如「初始化」、「計算階段」),即可在 CPU 利用率與執行緒視圖看到垂直標記與工具提示,將效能資料對應業務邏輯。
平台支援與注意事項
- 僅支援 Windows Vista/Server 2008/7/Server 2008 R2 及以上 (需 ETW)。
- 支援原生 C/C++ 與 .NET 2.0+ (不含 1.1)。
- 高負載下可能丟失 ETW 事件,可減少干擾程式或增加 ETW 緩衝區大小。
結語
Concurrency Visualizer 將平行效能分析視覺化、資料驅動化,從 CPU 利用率、執行緒阻塞、核心排程三維度切入,配合豐富報告與原始碼跳轉,讓開發者能快速定位並解決平行效能瓶頸,是多核心開發必備利器。