勇哥注: 一般我们通过使用windows的任务管理器来分析软件的性能问题。 通过cpu占用率、cpu时间、线程数量、句柄数量几个关键参数来分析软件存在的内在泄露、暴句柄、吃cpu等等问题。 这里我们来研究一下vs自带的性能分析工具,勇哥之前也没有接触过。因此此篇我与大家共同学习。
(一)先看下怎么启用vs的性能分析工具。
首先,调试菜单选择“性能探查器"。
点击 之后会出现下面的界面。
这里可以选择分析现有项目,还是分析其它项目或者其它可执行文件。若是分析其它项目我们选择 “更改目标” 按钮如下图所示:
选择可执行文件,然后点击开始,弹出以下界面:
(二)来段有问题的代码,使用“CPU采样“。
分析目标为”启动项目“。
这个小测试程序当中勇哥故意弄了一个timer,但是错误的让它陷入了死循环。
private void timer1_Tick(object sender, EventArgs e) { while(true) { RtbMsg.AppendText($"{Thread.CurrentThread.ManagedThreadId}\n"); } }
程序启动后,由于timer卡死了ui,点关闭窗体是无效的,并且被windows强制退出了。
然后等一段时间,性能分析器分析出了结果。
此结果中,勇哥一眼就看到了一个方法AppendText() 占用了cpu的18464毫秒,总计93.11%的时间。
鼠标置于方法名上面,出现树型图标,我们点击进去,可以查看调用堆栈的情况。
通过三个窗口: 调用者、当前函数、调用堆栈,可以依次点击,最终定到代码段 timer1_Tick,
此函数是占用cpu时间最多。
最下面的代码窗口,还定位到了具体的行号。
如果要看更详细的信息,点击“创建详细的报告”。
稍等一会,产生的报告如下图所示:
这份报告中,我们更容易看到耗cpu时间最多的方法是 AppendText。占比98.03%
独占:指该函数中不包含子函数的执行时间; 非独占(即分摊):指包含子函数执行时间的总执行时间。 上面解释如果不明白,勇哥拿房产面积来讲。 一套房的面积为:套内面积+分摊面积,套内面积是独占面积,分摊面积即非独占面积。 所以非独占即是分摊。 因此我们看一个函数占用cpu时间多不多,应该看它的独占样本。
这里我们可以看到哪些函数占用的cpu比较多,函数的调用过程是怎样的,如果想看某个函数直接点击函数名,看函数的详细信息,我们可以根据语句执行的执行效率来进行针对性的修改,如下图:
---------------------
作者:hackpig
来源:www.skcircle.com
版权声明:本文为博主原创文章,转载请附上博文链接!

