關於VisualStudio性能分析數據中的獨佔樣本數和非獨佔樣本數的意義

VisualStudio中自帶有Profile工具進行性能性能分析,其中用得比較多的數據是函數調用時間,它主要有獨佔樣本數和非獨佔樣本數兩個指標,關於這兩個指標表明的意義,MSDN的解釋比較文藝:
  • 非獨佔樣本數: 爲函數收集的性能數據的總數,其中包括該函數調用的其餘函數的性能數據。
  • 非獨佔轉換次數: 在此函數(包括此函數調用的函數)的全部實例中發生操做系統(轉換)事件的次數。

其它性能數據解釋能夠參看:http://msdn.microsoft.com/zh-cn/library/ms242747(v=vs.90).aspx函數

固然,就算看不懂兩個數據表示的具體意義也無礙於咱們分析性能瓶頸,反正數值大的確定是性能瓶頸。不過,爲了更好的使用這個工具,仍是稍微理解點的好。工具

爲了通俗的解釋這兩個指標,我這裏寫了兩個簡單的函數Foo1和Foo2,其中Foo1調用了Foo2,其它的函數體是同樣的。post

    static void Foo1()
    {
        var total = 0;
        for (int i = 0; i < 10000 * 10000; i++)
        {
            total += i;
        }

        Foo2();
    }

    static void Foo2()
    {
        var total = 0;
        for (int i = 0; i < 10000 * 10000; i++)
        {
            total += i;
        }
    }
性能

咱們的調用方式以下: spa

    static void Main(string[] args)
    {
        System.Threading.Thread.Sleep(2000);        //
等待採集器啓動須要一段時間
        Foo1();
    }
操作系統

此時生成的性能報告以下: blog

函數名生命週期

非獨佔樣本數進程

獨佔樣本數事件

非獨佔樣本數百分比

獨佔樣本數百分比

ConsoleApplication1.Program.Foo1

526

289

99.81

54.84

ConsoleApplication1.Program.Foo2

237

237

44.97

44.97

對於Foo2,它的獨佔樣本數和非獨佔樣本數是同樣的;而對於Foo1它的非獨佔樣本數是獨佔樣本數的兩倍。

從中能夠看出:

  • 非獨佔樣本數是指的包括了子函數執行時間執行時間
  • 獨佔樣本數是不包括子函數執行時間函數體執行時間

若是把Main函數的採集數據放在一塊兒就更容易理解了:Main函數獨佔樣本數百分比爲0,由於它的函數體執行時間幾乎忽略不計,而非獨佔樣本數百分比爲100%,由於它在整個進程的生命週期內都存在。

函數名

非獨佔樣本數

獨佔樣本數

非獨佔樣本數百分比

獨佔樣本數百分比

ConsoleApplication1.Program.Foo1

526

289

99.81

54.84

ConsoleApplication1.Program.Foo2

237

237

44.97

44.97

ConsoleApplication1.Program.Main

527

0

100

0

相關文章
相關標籤/搜索