欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

关于VS2012自带的 性能分析 工具使用实例(图文介绍)

程序员文章站 2024-03-02 08:09:58
本篇通过一小段代码的console程序来进行性能的分析以及改进、直到后面的改进前、改进后性能比较结果。 先看console代码(源代码下载): 复制代码 代码如下:st...

本篇通过一小段代码的console程序来进行性能的分析以及改进、直到后面的改进前、改进后性能比较结果

先看console代码(源代码下载):

复制代码 代码如下:

static void main(string[] args)
        {
            int i = 10000;
            while(i-->0)
            {
                core c=new  core();
                c.process(datetime.now.tostring());
            }
        }
public class core
    {
        public void process(string input)
        {
            //process logic
            string result = string.format("{0}-{1}", datetime.now, input);

            //log to file
            log(result);
        }

        public void log(string message)
        {
            string filename = system.io.path.combine(appdomain.currentdomain.basedirectory, "log.txt");

            string msg = "{now}: {message}";
            msg = msg.replace("{now}", datetime.now.tostring("yyyy-mm-dd hh:mm:ss"));
            msg = msg.replace("{message}", message);
            using (streamwriter sw = system.io.file.appendtext(filename))
            {
                sw.writeline(msg);
                sw.flush();
                sw.close();
            }
        }
    }

关于VS2012自带的 性能分析 工具使用实例(图文介绍)

 点击“完成”按钮,此时会自动进行分析,直接跑完控制台程序,vs2012会自动显示出分析报告,如下:
关于VS2012自带的 性能分析 工具使用实例(图文介绍)

从上面的“摘要”报告中得知

    system.io.file.appendtext函数和system.appdomain.get_basedirectory函数耗时最多,我们需要先优化这2个函数的使用(稍后再讲)共列出了最耗时的5个函数

报告视图种类:

生成的报告视图有很多种,上面所示默认的是“摘要”视图,其他类型的视图如下所列:
关于VS2012自带的 性能分析 工具使用实例(图文介绍)

那么我们如何跟踪这几个耗时的函数呢?我们需要转入“函数详细信息”视图,如下:

关于VS2012自带的 性能分析 工具使用实例(图文介绍)

右边红框代表耗时分布比例,显然上图中process函数占用了很大比例

下边的红框代表相应的代码,并且还会红色高亮性能损耗突出的代码行、以及相应损耗比例(图中的99.2%是由于这行代码共有3个损耗点:83.3%+14.4%+1.5%)

我们需要往下跟踪,进入最严重的process函数进行查看,我们click右边红框中的process条,进入细化的分析界面,如下:
关于VS2012自带的 性能分析 工具使用实例(图文介绍)

看来主要问题来自"log(result)"代码行,占了73.5%,继续深入跟踪,如下图:

关于VS2012自带的 性能分析 工具使用实例(图文介绍)

这下差不多了,这里比较损耗多的2行是:获得filename和appendtext到日志文件代码行,分别优化:

    获得文件名优化日志文件名是不变的,因此不用每次log(msg)都要计算,直接extract为static的filename变量appendtext优化一旦牵涉到i/o操作,速度就慢,无法避免(从单行代码的角度来看),那怎么办?那就把结构改掉吧:主程序写入log到队列中,由另外一个thread负责写入到磁盘中

  修改代码如下:  

复制代码 代码如下:

public class core
    {
        public void process(string input)
        {
            //process logic
            string result = string.format("{0}-{1}", datetime.now, input);

            //log to file
            log(result);
        }


        private static list<string> log = new list<string>();
        public static void log(string message)//filename去掉了,因为此时已经不需要这个变量了,因为是由其他线程负责写入磁盘
        {
            string msg = "{now}: {message}";
            msg = msg.replace("{now}", datetime.now.tostring("yyyy-mm-dd hh:mm:ss"));
            msg = msg.replace("{message}", message);
            log.add(msg);
        }

    }   

我们再次运行性能分析,如下:
关于VS2012自带的 性能分析 工具使用实例(图文介绍)

我们比较下第一次和这一次的曲线图:

关于VS2012自带的 性能分析 工具使用实例(图文介绍)

改进后的性能明显好于改进之前的性能。

自定义性能分析

我们可以通过修改属性来add/remove性能指标,比如要加入某个/某些windows计数器、收集windows事件、收集.net对象生命周期等,我们可以进行如下操作来进行设置:
关于VS2012自带的 性能分析 工具使用实例(图文介绍)

将会生成如下更详细的报告:

关于VS2012自带的 性能分析 工具使用实例(图文介绍)

报告中会列出生成的最多的是哪种对象(本例中是string)、由哪些函数导致的分配了最多的内存、等等

在“标记”视图中,能看到每隔500毫秒收集的windows计数器数据,如下图就是磁盘队列计数器的收集:
关于VS2012自带的 性能分析 工具使用实例(图文介绍)

在“对象生存期”视图中,能看到各种对象从new到dispose的所有数据,如下图:
关于VS2012自带的 性能分析 工具使用实例(图文介绍)

很牛b吧。

下面说说如何通过vs2012来对独立运行的程序进行性能分析,其实很简单,就下面这个图就搞定了,大家都懂的:
关于VS2012自带的 性能分析 工具使用实例(图文介绍)

再说说如何对web项目性能分析吧...

先打开web项目解决方案,然后直接进行性能分析,有人会说没有请求操作啊,这个简单,有多个解决办法:

再开一个vs环境(无论是远程的还是本地的),通过web负载测试来疯狂请求通过loadrunner/qtp来模拟请求悲催的人工请求...