Visual studio 2010 的Profiler是自帶的性能工具, 利用它我們可以找出程序中的性能瓶頸,然后不斷優化不斷再測試。
### 簡介
Profiler有利用向導啟動程序和后期附加到程序兩種關聯被測模塊的方式,測試方式也有兩種:**Sampling(采樣)**和**Instrumentation(檢測)**。
-
Sampling:按設置的時間間隔中斷計算機處理器并收集函數調用堆棧。
調用堆棧是一個動態結構,用于存儲有關正在處理器上執行的函數的信息。這個分析方法形成的結果就是各個函數在運行時被采樣的次數,次數越大代表開銷越大。因為對被測源碼不需要更改,所以直接啟動或者后期附加到被測程序都可以。
-
Instrumentation:在被測源碼文件中**目標函數的開始和結尾**以及這些函數**對其他函數的每次調用前后**插入代碼。
插入的代碼記錄了以下信息:
1. 此收集事件與上一收集事件之間的間隔。
1. 在此間隔內操作系統是否執行了操作。
例如,操作系統可能讀寫磁盤,或者在目標線程與另一個進程中的另一個線程之間進行切換。
*根據”Tools\Options\Performance Tools\“ 下‘Show time values as:’的默認設置為Milliseconds,我覺得采樣周期應該是毫秒級,也就是說報告中采樣次數可以約等于毫秒。*
### 使用
1. 用管理員啟動Visual Studio
1. 針對Release版本的程序
1. 設置好程序所需的pdb路徑
通過‘Analyze\Launch Performance Wizard…’ 或者‘Analyze\Profiler\Attach or Detach…’對被測程序進行新建Performance Session(性能會話), 我們主要介紹下Sampling通過Attach To Process的情況下報告的分析。
Profiler開始后,類似:

當你覺得已經收集了足夠的信息可以停止后, 點擊‘Stop profiling’, 類似:

上述界面就是報告的Summary, 我們開始分析程序的性能瓶頸。
-
**‘Hot Path’**指的就是采樣次數高的,也就是性能瓶頸的函數。
-
**‘Inclusive Samples’**指的是該函數整體被采樣的次數,說白了,就是函數本身以及它所調用的所有子函數的總共開銷大小。
-
**‘Exclusive Samples’**指的是該函數本身被采樣的次數,說白了,也就是函數自己的開銷大小,不包含它所調用的子函數的開始。
- **‘Funcions Doding Most Individual Work’**指的是開銷最大的單個函數,因此它的指標是用‘Exclusive
Samples’來表示。
通過上述幾個介紹,我們就可以從圖中得到性能瓶頸的函數, 然后根據Call Tree可以得到完整的調用上下文。
例如,在Summary界面中點擊CallTree,按照‘Inclusive Samples’排序,按照開銷大小展開方法,最終就可以得到開銷大的函數上下文, 類似:

當然,我們也可以通過上面的過濾條件選擇”Modules“、”Threads“等方式來找到自己關心的瓶頸。
另外, 我們還可以在Summary界面選擇‘Show Just My Code’和適當的CPU時間段來過濾。
參考:[Analyzing Application Performance by Using Profiling Tools](https://msdn.microsoft.com/en-us/library/z9z62c29%28v=vs.100%29.aspx)