VS2012自带的 性能分析 工具使用实例

http://www.cnblogs.com/aarond/archive/2013/04/19/performance-enhancement.html

本篇通过一小段代码的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会自动显示出分析报告,如下:

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

  1. System.IO.File.AppendText函数和System.AppDomain.get_BaseDirectory函数耗时最多,我们需要先优化这2个函数的使用(稍后再讲)
  2. 共列出了最耗时的5个函数

报告视图种类:

生成的报告视图有很多种,上面所示默认的是“摘要”视图,其他类型的视图如下所列:

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

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

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

我们需要往下跟踪,进入最严重的process函数进行查看,我们click右边红框中的Process条,进入细化的分析界面,如下:

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

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

  1. 获得文件名优化

    • 日志文件名是不变的,因此不用每次Log(msg)都要计算,直接extract为static的fileName变量
  2. 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);
        }

    }

我们再次运行性能分析,如下:

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

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

自定义性能分析

我们可以通过修改属性来add/remove性能指标,比如要加入某个/某些Windows计数器、收集Windows事件、收集.NET对象生命周期等,我们可以进行如下操作来进行设置:

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

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

在“标记”视图中,能看到每隔500毫秒收集的windows计数器数据,如下图就是磁盘队列计数器的收集:

在“对象生存期”视图中,能看到各种对象从new到dispose的所有数据,如下图:

很牛b吧。

下面说说如何通过VS2012来对独立运行的程序进行性能分析,其实很简单,就下面这个图就搞定了,大家都懂的:

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

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

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

Console源代码下载

觉得有用的话帮我“推荐”click吧...

时间: 2024-10-15 19:52:44

VS2012自带的 性能分析 工具使用实例的相关文章

VS2010自带的性能分析工具分析.NET程序的性能

这篇博文给大家分享的是,如何使用VS自带的性能分析工具来分析我们编写的.NET程序,一边找出程序性能的瓶颈,改善代码的质量.在实际开发中,性能真的很重要,往往决定一个产品的生死~良好的用户体验的基础之一也是程序要有好的性能~ 下面以一个大家熟悉比较极端的例子,来说明编写代码时考虑性能的重要性.这里DebugLZQ用的是10.0版本的VS. 示例程序代码如下: using System;using System.Collections.Generic;using System.Linq;using

Mysql自带profiling性能分析工具使用分享

1. show variables like '%profiling%';(查看profiling信息) 2. set profiling=1;(开启profiling) 3. 执行SQL查询 例:select goods_name from ecs_goods where goods_id <5000; show  profiles; 4. show profile for query 4; show profile 的格式如下: SHOW PROFILE [type [, type] ...

Mysql自带profiling性能分析工具

1. show variables like '%profiling%';(查看profiling信息)  www.2cto.com 2. set profiling=1;(开启profiling) 3. 执行SQL查询 例:select goods_name from ecs_goods where goods_id <5000; show  profiles; 4. show profile for query 4; show profile 的格式如下: SHOW PROFILE [typ

性能分析工具

最近编程需要对性能进行优化,看到VS2012自带的性能分析工具感觉超级赞,就在网上搜了一下,看到VS2012自带的性能分析工具使用实例写的非常不错,保存一下,值得一看.

使用vs自带的性能诊断工具

visual studio是个强大的集成开发环境,内置了程序性能诊断工具.下面通过两段代码进行介绍. static void Main( string[] args) { Test1(); Test2(); Console.ReadKey(); } protected static void Test1() { Stopwatch sp = new Stopwatch(); sp.Start(); string str = "" ; for (int i = 0; i < 100

三种Linux性能分析工具的比较

无论是在CPU设计.服务器研发还是存储系统开发的过程中,性能总是一个绕不过去的硬指标.很多时候,我们发现系统功能完备,但就是性能不尽如意,这时候就需要找到性能瓶颈.进行优化.首先我们需要结合硬件特点.操作系统和应用程序的特点深入了解系统内部的运行机制.数据流图和关键路径,最好找出核心模块.建立起抽象模型:接着需要利用各种性能分析工具,探测相关模块的热点路径.耗时统计和占比.在这方面,Linux操作系统自带了多种灵活又具有专对性的工具,此外一些厂家也开源了不少优秀的性能分析工具.下面就结合笔者最近

Java性能优化指南系列(二):Java 性能分析工具

进行JAVA程序性能分析的时候,我们一般都会使用各种不同的工具.它们大部分都是可视化的,使得我们可以直观地看到应用程序的内部和运行环境到底执行了什么操作,所以性能分析(性能调优)是依赖于工具的.在第2章,我强调了基于数据驱动的性能测试是非常重要的,我们必须测试应用的性能并理解每个指标的含义.性能分析和数据驱动非常类似,为了提升应用程序的性能,我们必须获取应用运行的相关数据.如何获取这些数据并理解它们是本章的主题.[本章重点介绍JDK中提供的性能分析工具] 操作系统工具及其分析 程序分析的起点并不

超全整理!Linux性能分析工具汇总合集

出于对Linux操作系统的兴趣,以及对底层知识的强烈欲望,因此整理了这篇文章.本文也可以作为检验基础知识的指标,另外文章涵盖了一个系统的方方面面.如果没有完善的计算机系统知识,网络知识和操作系统知识,文档中的工具,是不可能完全掌握的,另外对系统性能分析和优化是一个长期的系列. 本文档主要是结合Linux 大牛,Netflix 高级性能架构师 Brendan Gregg 更新 Linux 性能调优工具的博文,搜集Linux系统性能优化相关文章整理后的一篇综合性文章,主要是结合博文对涉及到的原理和性

Java几款性能分析工具的对比

在给客户的应用程序维护的过程中,我注意到在高负载下的一些性能问题.理论上,增加对应用程序的负载会使性能等比率的下降.然而,我认为性能下降的比率远远高于负载的增加.我也发现,性能可以通过改变应用程序的逻辑来提升,甚至达到极限.为了更详细的了解这一点,我们需要做一些性能分析... 在给客户进行应用程序维护的过程中,我注意到一些关于高负载条件下的性能问题.理论上,增加对应用程序的负载会使性能有所下降,但是我认为性能下降的比率远远高于负载的增加,同时我也发现,性能可以通过改变应用程序的逻辑来提升.为了更