1. 程式人生 > >使用PrefView監測.NET程式效能(三):分組

使用PrefView監測.NET程式效能(三):分組

上一篇部落格中,我們通過Perfview幫助檔案中自帶的程式碼來簡單使用了Perfview,瞭解了基本操作。現在來看看Perfview中的分組操作(Grouping)。分組功能都旨將記錄到的各種函式呼叫堆疊以指定的規則進行分組,幫助你組織和找到更關心的資料。

為什麼需要分組

 在實際使用中,PerfView通常會收集到非常多的函式呼叫棧資料,包括我們關心的程式的函式呼叫資訊,及一大堆我們不關心的其他函式呼叫資訊,例如windows系統的底層函式。這麼多有用沒用的條目都列出在列表檢視上,令人眼花繚亂。如何將我們不需要的資料分組歸納呢?Perfview提供分組功能。

分組功能使用類似於正則的匹配功能,將函式全名(一個函式的全名包含了程式集,名稱空間,類名和函式名,例如"mscorlib.n!System.DateTime.get_Now()")進行匹配,並替換成自定義的分組名稱。例如,可以對所有在Debug目錄下的程式集的函式單獨顯示,而其他函式則分組成“OTHER”,這樣,我們就可以只看見我們程式裡的函式呼叫。其實這就是預設的[Just My App]分組規則的作用:

 

萬用字元

那麼,分組功能如何使用呢?

在使用分組之前,先看看PerfView定義的幾個"萬用字元":

* :匹配任意數量的字元

%:匹配任意數量的數字和英文字母和點號("."),等於.NET正則中的 [\w\d.]*

^ :匹配開頭

|:“或”操作

{}:代表一個分組,等於.NET正則裡的小括號

 

分組規則

PerfView中有兩種分組操作,分別是 PAT->GROUP 和 PAT=>GROUP。在這裡“PAT”代表需要匹配的模式(Pattern),“GROUP”代表你自定義的組名。 而這兩種分組方式區別就在於中間的“->”和"=>",前者表示忽略入口函式,後者則會將入口函式顯示在分組中。有時我們希望知道一個分組裡的函式最初是由哪個函式開始呼叫的,這時候就可以使用後者了。除此之外,兩種分組方式沒有其他不同。

 我們看看具體的分組規則的使用:

1. PAT->GROUP形式

如上述,PAT->GROUP形式是簡單地將一個函式的全名稱中包含"PAT"字眼的條目都分到“GROUP”組中,例如,在不分組的情況下,我們收集到的函式呼叫資料列表是這樣的:

裡面有我們Tutorial.exe的函式,例如,tutorial!Program.SpinForASecond()和tutorial!Program.RecSpin(),同時也有很多.NET的內部函式,例如 mscorlib.n!System.get_Now()和mscorlib.n!System.TimeSpan.get_TotalSeconds(),等等。假設我們只關心tutorial.exe自身的函式,而不希望被.NET內部函式所幹擾,我們則可以設定一個分組規則“mscorlib->.NET”,這樣,所有包含“mscorlib”字眼的方法全名稱的條目都會被分組進“.NET”組,效果如下:

是不是清爽了很多?這樣的分組能使我們快速地過濾掉mscorlib有關的函式,只剩下tutorial自己的函式(和一些其他函式,當然如果你願意,也可以將其他的函式"分組"掉)

 

2. {*}=>$1

該形式的規則意思是: 花括號裡匹配到的條目會被分組,而組名正是是花括號裡的匹配到的內容,“$1”是一個佔位符,對應的是花括號“{}”裡的內容。假設有兩個函式:tutorial!Program.SpinForASecond()和tutorial!Program.RecSpin(), 而應用的規則是“{tutorial!}->My APP $1”,則分組後,這兩個函式被分進一組,並且組名為“My App tutorial!”

Perfview還支援同時設定多個規則,例如設定規則為“{tutorial!}->My APP $1;{mscorlib.ni!}->Internal $1”,這裡有兩個規則,一個是藍色部分,另一個是紅色部分,中間用分號(;)隔開。如果函式全名中有"tutorial!"的就分進名為“My APP tutorial!”組,而有“mscorlib.ni!”字眼的就分進“Internal mscorlib.ni!”組。

 

3.PAT=>GROUP

最後來看看入口點規則分組(Entry Point Grouping)。前邊提到過,“PAT=>GROUP”與“PAT->GROUP”的不同在於,後者會忽略掉該組的入口函式,意味著你很難知道某個分組裡的函式是從哪個函式執行進去的,而前者則會包含入口點函式資訊。我們通過圖例來看看實際效果。

下圖中,使用“mscorlib->System Functions”規則來對mscorlib的函式進行分組,組名為“System Functions”,但除非你展開這個分組的明細,查詢每個函式呼叫樹,否則你不知道是什麼函式呼叫了這組函式。

 

而現在使用“mscorlib=>System Functions”,看看有什麼不同:

System Functions組明確指示了該組的函式的入口點是“mscorlib.ni!System.DateTime.get_Now()”函式,即DateTime.Now導致了這些函式的執行。

 

以上便是PerfView的分組功能。但其實這只是分組功能中的一部分。通過規則的搭配可以有更強大的效果。而最全面的說明其實是在PerfView自帶的F1幫助檔案。這裡只作一個拋磚引玉的簡要說明。因此如果需要了解更全面的分組技巧,可以去幫助檔案裡搜尋相關主題。