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

本篇通过一小段代码的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负责写入到磁盘中

  修改代码如下:  

复制代码 代码如下:

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wjgsfw.html