在上一篇博客中,咱們經過Perfview幫助文件中自帶的代碼來簡單使用了Perfview,瞭解了基本操做。如今來看看Perfview中的分組操做(Grouping)。分組功能都旨將記錄到的各類函數調用堆棧以指定的規則進行分組,幫助你組織和找到更關心的數據。html
在實際使用中,PerfView一般會收集到很是多的函數調用棧數據,包括咱們關心的程序的函數調用信息,及一大堆咱們不關心的其餘函數調用信息,例如windows系統的底層函數。這麼多有用沒用的條目都列出在列表視圖上,使人眼花繚亂。如何將咱們不須要的數據分組概括呢?Perfview提供分組功能。windows
分組功能使用相似於正則的匹配功能,將函數全名(一個函數的全名包含了程序集,命名空間,類名和函數名,例如"mscorlib.n!System.DateTime.get_Now()")進行匹配,並替換成自定義的分組名稱。例如,能夠對全部在Debug目錄下的程序集的函數單獨顯示,而其餘函數則分組成「OTHER」,這樣,咱們就能夠只看見咱們程序裏的函數調用。其實這就是默認的[Just My App]分組規則的做用:函數
那麼,分組功能如何使用呢?性能
在使用分組以前,先看看PerfView定義的幾個"通配符":spa
* :匹配任意數量的字符htm
%:匹配任意數量的數字和英文字母和點號("."),等於.NET正則中的 [\w\d.]*blog
^ :匹配開頭get
|:「或」操做博客
{}:表明一個分組,等於.NET正則裏的小括號it
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幫助文件。這裏只做一個拋磚引玉的簡要說明。所以若是須要了解更全面的分組技巧,能夠去幫助文件裏搜索相關主題。
使用PerfView監測.NET程序性能(一):Event Trace for Windows