使用PerfView监测.NET程序性能(三):分组
在上一篇博客使用PerfView監(jiān)測(cè).NET程序性能(二):Perfview的使用中,我們通過Perfview幫助文件中自帶的代碼來簡單使用了Perfview,了解了基本操作。現(xiàn)在來看看Perfview中的分組操作(Grouping)。分組功能都旨將記錄到的各種函數(shù)調(diào)用堆棧以指定的規(guī)則進(jìn)行分組,幫助你組織和找到更關(guān)心的數(shù)據(jù)。
為什么需要分組
?在實(shí)際使用中,PerfView通常會(huì)收集到非常多的函數(shù)調(diào)用棧數(shù)據(jù),包括我們關(guān)心的程序的函數(shù)調(diào)用信息,及一大堆我們不關(guān)心的其他函數(shù)調(diào)用信息,例如windows系統(tǒng)的底層函數(shù)。這么多有用沒用的條目都列出在列表視圖上,令人眼花繚亂。如何將我們不需要的數(shù)據(jù)分組歸納呢?Perfview提供分組功能。
分組功能使用類似于正則的匹配功能,將函數(shù)全名(一個(gè)函數(shù)的全名包含了程序集,命名空間,類名和函數(shù)名,例如"mscorlib.n!System.DateTime.get_Now()")進(jìn)行匹配,并替換成自定義的分組名稱。例如,可以對(duì)所有在Debug目錄下的程序集的函數(shù)單獨(dú)顯示,而其他函數(shù)則分組成“OTHER”,這樣,我們就可以只看見我們程序里的函數(shù)調(diào)用。其實(shí)這就是默認(rèn)的[Just My App]分組規(guī)則的作用:
?
通配符
那么,分組功能如何使用呢?
在使用分組之前,先看看PerfView定義的幾個(gè)"通配符":
* :匹配任意數(shù)量的字符
%:匹配任意數(shù)量的數(shù)字和英文字母和點(diǎn)號(hào)("."),等于.NET正則中的 [\w\d.]*
^ :匹配開頭
|:“或”操作
{}:代表一個(gè)分組,等于.NET正則里的小括號(hào)
?
分組規(guī)則
PerfView中有兩種分組操作,分別是 PAT->GROUP 和 PAT=>GROUP。在這里“PAT”代表需要匹配的模式(Pattern),“GROUP”代表你自定義的組名。 而這兩種分組方式區(qū)別就在于中間的“->”和"=>",前者表示忽略入口函數(shù),后者則會(huì)將入口函數(shù)顯示在分組中。有時(shí)我們希望知道一個(gè)分組里的函數(shù)最初是由哪個(gè)函數(shù)開始調(diào)用的,這時(shí)候就可以使用后者了。除此之外,兩種分組方式?jīng)]有其他不同。
?我們看看具體的分組規(guī)則的使用:
1. PAT->GROUP形式
如上述,PAT->GROUP形式是簡單地將一個(gè)函數(shù)的全名稱中包含"PAT"字眼的條目都分到“GROUP”組中,例如,在不分組的情況下,我們收集到的函數(shù)調(diào)用數(shù)據(jù)列表是這樣的:
里面有我們Tutorial.exe的函數(shù),例如,tutorial!Program.SpinForASecond()和tutorial!Program.RecSpin(),同時(shí)也有很多.NET的內(nèi)部函數(shù),例如 mscorlib.n!System.get_Now()和mscorlib.n!System.TimeSpan.get_TotalSeconds(),等等。假設(shè)我們只關(guān)心tutorial.exe自身的函數(shù),而不希望被.NET內(nèi)部函數(shù)所干擾,我們則可以設(shè)置一個(gè)分組規(guī)則“mscorlib->.NET”,這樣,所有包含“mscorlib”字眼的方法全名稱的條目都會(huì)被分組進(jìn)“.NET”組,效果如下:
是不是清爽了很多?這樣的分組能使我們快速地過濾掉mscorlib有關(guān)的函數(shù),只剩下tutorial自己的函數(shù)(和一些其他函數(shù),當(dāng)然如果你愿意,也可以將其他的函數(shù)"分組"掉)
?
2. {*}=>$1
該形式的規(guī)則意思是: 花括號(hào)里匹配到的條目會(huì)被分組,而組名正是是花括號(hào)里的匹配到的內(nèi)容,“$1”是一個(gè)占位符,對(duì)應(yīng)的是花括號(hào)“{}”里的內(nèi)容。假設(shè)有兩個(gè)函數(shù):tutorial!Program.SpinForASecond()和tutorial!Program.RecSpin(), 而應(yīng)用的規(guī)則是“{tutorial!}->My APP $1”,則分組后,這兩個(gè)函數(shù)被分進(jìn)一組,并且組名為“My App tutorial!”
Perfview還支持同時(shí)設(shè)置多個(gè)規(guī)則,例如設(shè)置規(guī)則為“{tutorial!}->My APP $1;{mscorlib.ni!}->Internal $1”,這里有兩個(gè)規(guī)則,一個(gè)是藍(lán)色部分,另一個(gè)是紅色部分,中間用分號(hào)(;)隔開。如果函數(shù)全名中有"tutorial!"的就分進(jìn)名為“My APP tutorial!”組,而有“mscorlib.ni!”字眼的就分進(jìn)“Internal?mscorlib.ni!”組。
?
3.PAT=>GROUP
最后來看看入口點(diǎn)規(guī)則分組(Entry Point Grouping)。前邊提到過,“PAT=>GROUP”與“PAT->GROUP”的不同在于,后者會(huì)忽略掉該組的入口函數(shù),意味著你很難知道某個(gè)分組里的函數(shù)是從哪個(gè)函數(shù)執(zhí)行進(jìn)去的,而前者則會(huì)包含入口點(diǎn)函數(shù)信息。我們通過圖例來看看實(shí)際效果。
下圖中,使用“mscorlib->System Functions”規(guī)則來對(duì)mscorlib的函數(shù)進(jìn)行分組,組名為“System Functions”,但除非你展開這個(gè)分組的明細(xì),查找每個(gè)函數(shù)調(diào)用樹,否則你不知道是什么函數(shù)調(diào)用了這組函數(shù)。
?
而現(xiàn)在使用“mscorlib=>System Functions”,看看有什么不同:
System Functions組明確指示了該組的函數(shù)的入口點(diǎn)是“mscorlib.ni!System.DateTime.get_Now()”函數(shù),即DateTime.Now導(dǎo)致了這些函數(shù)的執(zhí)行。?
以上便是PerfView的分組功能。但其實(shí)這只是分組功能中的一部分。通過規(guī)則的搭配可以有更強(qiáng)大的效果。而最全面的說明其實(shí)是在PerfView自帶的F1幫助文件。這里只作一個(gè)拋磚引玉的簡要說明。因此如果需要了解更全面的分組技巧,可以去幫助文件里搜索相關(guān)主題。
總結(jié)
以上是生活随笔為你收集整理的使用PerfView监测.NET程序性能(三):分组的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 微软发布新的 Azure Pipelin
- 下一篇: 【.NET Core项目实战-统一认证平