VisualStudio中自帶有Profile工具進行性能性能分析,其中用得比較多的資料是函數調用時間,它主要有獨占樣本數和非獨占樣本數兩個名額,關于這兩個名額代表的意義,MSDN的解釋比較文藝:
- 非獨占樣本數: 為函數收集的性能資料的總數,其中包括該函數調用的其他函數的性能資料。
- 非獨占轉換次數: 在此函數(包括此函數調用的函數)的所有執行個體中發生作業系統(轉換)事件的次數。
其它性能資料解釋可以參看:http://msdn.microsoft.com/zh-cn/library/ms242747(v=vs.90).aspx。
當然,就算看不懂兩個資料表示的具體意義也無礙于我們分析性能瓶頸,反正數值大的肯定是性能瓶頸。不過,為了更好的使用這個工具,還是稍微了解點的好。
為了通俗的解釋這兩個名額,我這裡寫了兩個簡單的函數Foo1和Foo2,其中Foo1調用了Foo2,其它的函數體是一樣的。
static
void Foo1()
{
var total = 0;
for (int i = 0; i < 10000 * 10000; i++)
{
total += i;
}
Foo2();
}
void Foo2()
我們的調用方式如下:
void Main(string[] args)
System.Threading.Thread.Sleep(2000); //等待采集器啟動需要一段時間
Foo1();
此時生成的性能報告如下:
函數名 | 非獨占樣本數 | 獨占樣本數 | 非獨占樣本數百分比 | 獨占樣本數百分比 |
ConsoleApplication1.Program.Foo1 | 526 | 289 | 99.81 | 54.84 |
ConsoleApplication1.Program.Foo2 | 237 | 44.97 |
對于Foo2,它的獨占樣本數和非獨占樣本數是一樣的;而對于Foo1它的非獨占樣本數是獨占樣本數的兩倍。
從中可以看出:
- 非獨占樣本數是指的包括了子函數執行時間的總執行時間
- 獨占樣本數是不包括子函數執行時間的函數體執行時間
如果把Main函數的采集資料放在一起就更容易了解了:Main函數獨占樣本數百分比為0,因為它的函數體執行時間幾乎忽略不計,而非獨占樣本數百分比為100%,因為它在整個程序的生命周期内都存在。
ConsoleApplication1.Program.Main | 527 |