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


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();
    }

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

我們的調用方式如下:

    static void Main(string[] args)
    {
        System.Threading.Thread.Sleep(2000);        //
等待采集器啟動需要一段時間
        Foo1();
    }

此時生成的性能報告如下:

函數名

非獨占樣本數

獨占樣本數

非獨占樣本數百分比

獨占樣本數百分比

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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM