首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> 關於.NET

Visual Studio 2010 並發分析實戰:資源爭用偵測與效能優化

     編輯:關於.NET

多核時代的同步挑戰

多核處理器普及迫使開發者撰寫多執行緒程式以榨取效能。但執行緒間通訊與同步(如 lock、Monitor、CriticalSection)若設計不當,反而因鎖爭用拖垮效能。VS2010 引入資源爭用並發分析,專門偵測此類瓶頸。

案例:矩陣乘法的冗餘同步

範例程式使用多執行緒計算矩陣乘法,每個執行緒負責結果矩陣 C 的不同列,理論上無寫入衝突,卻在整個雙重迴圈外包裹 EnterCriticalSection/LeaveCriticalSection:

for (i = myid*PerProcessorChunk; i < (myid+1)*PerProcessorChunk; i++) {
    EnterCriticalSection(&mmlock);
    for (j=0; j

分析資料收集

  1. 選單 分析 → 啟動分析精靈
  2. 選擇 並發,勾選 收集資源爭用資料
  3. 目標設為當前專案,完成後自動啟動分析
  4. 程式結束後,效能總管 顯示 .vsp 報告檔

啟用並發分析

效能總管報告

報告視圖深度解析

摘要視圖

三大關鍵區域:

  • 爭用圖:每秒爭用次數時間軸,可框選區間篩選
  • 爭用最多的資源:關鍵區段 1 佔 99.90% 爭用
  • 爭用最多的執行緒:依爭用次數排序(非持續時間)

摘要視圖

資源詳細資訊視圖

點擊資源名稱(如「關鍵區段 1」)進入。上半部時間軸顯示各執行緒爭用區塊(長度=阻塞時間),Total 列為所有爭用投影。大量重疊意味並行化極差:

資源詳細資訊

函式詳細資訊視圖

選取爭用區塊 → 底部呼叫堆疊 → 雙擊函式名稱(MatMult)定位原始碼行:EnterCriticalSection(&mmlock) 為禍首:

函式詳細資訊

執行緒詳細資訊與進程視圖

切換視角檢視特定執行緒被哪些資源阻塞,或進程層級的執行緒生命週期、爭用統計:

執行緒詳細資訊

進程視圖

爭用視圖與熱路徑

點擊資源視圖的「Total」超連結進入爭用視圖,依資源分組的呼叫樹並標示熱路徑:

爭用視圖熱路徑

修正驗證:註解化多餘鎖

// EnterCriticalSection(&mmlock);
// LeaveCriticalSection(&mmlock);

重新分析:爭用次數從 1,003 降為 1(僅剩啟動/結束同步):

修正後摘要

使用 效能總管 → 比較效能報告 直觀對比:MatMult 爭用歸零:

比較報告

命令列自動化收集

VSPerfCmd.exe /start:CONCURRENCY,RESOURCEONLY /output:Result.vsp
VSPerfCmd.exe /launch:MyApp.exe /args:"params"
VSPerfCmd.exe /detach
VSPerfCmd.exe /shutdown

支援附加至執行中進程 (/attach:PID),適合 CI/CD 整合。

視圖速查表

視圖用途
摘要調查起點,總覽爭用分布
呼叫樹聚合所有爭用堆疊
模組依模組統計爭用函式
呼叫者/被呼叫者三面板檢視函式關係
函式所有涉爭用函式清單
行原始碼行級爭用
資源詳細資訊特定鎖阻塞的所有執行緒
執行緒詳細資訊特定執行緒遭遇的所有鎖
爭用依資源分組的呼叫樹
標記使用者/自動標記與效能計數器
進程進程/執行緒生命週期與爭用統計
函式詳細資訊單一函式內部爭用分布
IP爭用發生的指令位址

結語

VS2010 資源爭用分析讓鎖爭用無所遁形,配合視圖切換與比較功能,能快速定位、驗證同步優化成果,是多執行緒效能調校的利器。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved