使用CLR Profiler分析.NET程序

就像剥去.NET语法糖衣的工具(Reflector等)很多一样,我们可以用来分析.NET程序性能的工具有很多,如前面一片博文DebugLZQ给大家介绍的vs自带的性能分析工具,除此之外常用的还有还有clr profiler、Windbg等。

  vs自带的性能分析可以很快的找到瓶颈代码,而且支持多线程。

  Windbg就不多说了,Windows平台下强大的用户态和内核态调试工具!虽然windbg也提供图形界面操作,但它最强大的地方还是有着强大的调试命令,用起来比较费劲。

  这里主要要说的是CLR Profile了,他检测结果最为详细,不过由于检测托管堆分配和垃圾回收会影响应用程序的运行速度,因此无法得之时间上的性能测试。

CLR Profiler简介

CLR Profiler 是用来观察托管堆内存分配和研究垃圾回收行为的一种工具。使用该工具中不同的视图,你能获得关于你运用程序的执行、内存的分配和消耗等有用信息。CLR Profiler分析的结果存放在日志文件中,常用的几种视图如下:

View Description
Histogram Allocated Types Gives you a high-level view of what object types are allocated (by allocation size) during the lifetime of your application. This view also shows those objects that are allocated in the large object heap (objects larger than 85 KB).

This view allows you to click parts of the graph so that you can see which methods allocated which objects.

Histogram Relocated Types Displays the objects that the garbage collector has moved because they have survived a garbage collection.
Objects By Address Provides a picture of what is on the managed heap at a given time.
Histogram By Age Allows you to see the lifetime of the objects on the managed heap.
Allocation Graph Graphically displays the call stack for how objects were allocated. You can use this view to:

-See the cost of each allocation by method.

-Isolate allocations that you were not expecting.

-View possible excessive allocations by a method.

Assembly, Module, Function, and Class Graph These four views are very similar. They allow you to see which methods pulled in which assemblies, functions, modules, or classes.
Heap Graph Shows you all of the objects in the managed heap, along with their connections.
Call Graph Lets you see which methods call which other methods and how frequently.

You can use this graph to get a feel for the cost of library calls and to determine how many calls are made to methods and which methods are called.

Time Line Displays what the garbage collector does over the lifetime of the application. Use this view to:

-Investigate the behavior of the garbage collector.

-Determine how many garbage collections occur at the three generations (Generation 0, 1, and 2) and how frequently they occur.

-Determine which objects survive garbage collection and are promoted to the next generation.

You can select time points or intervals and right-click to show who allocated memory in the interval.

Call Tree View Provides a text-based, chronological, hierarchical view of your application's execution. Use this view to:

-See what types are allocated and their size.

-See which assemblies are loaded as result of method calls.

-Analyze the use of finalizers, including the number of finalizers executed.

-Identify methods where Close or Dispose has not been implemented or called, thereby causing a bottleneck.

-Analyze allocations that you were not expecting.

下面还是以前面给出的代码为例,来介绍各种功能。代码如下:

 
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace VS2010性能测试
{
class Program
{
static void Main(string[] args)
{
int start = Environment.TickCount;
for (int i = 0; i < 1000; i++)
{
string s = "";
for (int j = 0; j <200; j++)
{
s += "Outer index = ";
s += i;
s += " Inner index = ";
s += j;
s += " ";
}
}
int middle = Environment.TickCount;
Console.WriteLine("Program part1 run for {0} seconds",0.001 * (middle - start));
//
for (int i = 0; i < 1000; i++)
{
StringBuilder s = new StringBuilder();
for (int j = 0; j <200; j++)
{
s.Append("Outer index = ");
s.Append(i);
s.Append("Inner index = ");
s.Append(j);
s.Append(" ");
}
}
int end = Environment.TickCount;
Console.WriteLine("Program part2 run for {0} seconds", 0.001 * (end - middle)); //
Console.ReadKey();
}
}
}
 

CLR Profiler程序的运行界面如下:

通过start application 选择需要运行的程序,可以选择是否跟踪内存分配和方法调用。当关闭应用程序(可以自动或手动),Profiler自动开始整理结果。分析结果存放在日志文件中,显示如下:

报告统计界面如下:

Heap statistics 堆栈统计信息:DebugLZQ的这个测试程序需要分配6.6GB的内存!你有想到过吗?

Allocation Graph:用图表显示堆栈的分配情况

Allocated bytes:应用程序整个启动周期内分配的对象。按照对象大小排列,不同的颜色代码不同的对象,在右侧会列出。以下图为例,红色的是String对象。

Relocated bytes:GC时被对象在托管堆中的位置被移动过的。不同的颜色代表不同的对象。

(简要介绍下GC过程,大概分两步:有具体算法判断哪些对象成为了垃圾(即根据根引用列表遍历列表引用所指向的对象,不能被遍历的对象);移动堆中的不为垃圾的对象)

Final Heap bytes:最终还在堆中的。颜色代表种类。

Garbage Collection Statistics :GC统计信息。总共进行了4501次0代垃圾回收!

Time视图如下;从图中可以清晰的看出各次回收时间和前后内存占用量(总共4501次)。

GC Handle: 统计GC句柄数

具体细节如下:

就介绍到这里吧。

更为详细的信息,请阅读CLR Profiler 108页的详细说明,这个文档就在你释放出来的文件的根目录下,名称是CLRProfiler.doc。

使用CLR Profiler分析.NET程序的更多相关文章

  1. Net Memory Profiler 分析.Net程序内存泄露

    Net Memory Profiler 分析.Net程序内存泄露 Haozes's Tech Space 人類的全部才能無非是時間和耐心的混合物 使用.Net Memory Profiler 分析.N ...

  2. How To: Use CLR Profiler

    (翻译)How To: Use CLR Profiler   第一次翻译对我而言比较长的E文,有很多不足之处,请见谅.(个人的习惯GC又做了名词又做了名词) 原文:http://msdn.micros ...

  3. 使用VS自带的工具分析.NET程序的性能

    (转自:http://www.cnblogs.com/DebugLZQ/archive/2012/07/10/2585245.html) 这篇博文给大家分享的是,如何使用VS自带的性能分析工具来分析我 ...

  4. CLR Profiler 性能分析工具 (转)

    原文地址:http://www.cnblogs.com/kevinlzf/archive/2010/11/12/1876066.html 下载地址:http://www.microsoft.com/e ...

  5. CLR Profiler 性能分析工具

    CLR Profiler 性能分析工具 CLR Profiler 性能分析工具 CLR Profiler 有两个版本,分别用于CLR1.1 和 CLR2.0,至于CLR4试了一些也可以,但不知道是否完 ...

  6. 使用CLR Profiler查看C#运行程序的内存占用情况

    http://blog.csdn.net/wy3552128/article/details/8158938 https://msdn.microsoft.com/en-us/library/ff65 ...

  7. Use CLR Profiler

    Use CLR Profiler 第一次翻译对我而言比较长的E文,有很多不足之处,请见谅.(个人的习惯GC又做了名词又做了名词) 原文:http://msdn.microsoft.com/en-us/ ...

  8. CLR Profiler

    检查c#代码内存泄露工具-CLR Profiler 大家都知道.net有一套自己的内存(垃圾)回收机制,除非有一些数据(方法)长期占有内存不随着垃圾回收功能而释放内存,这样就造成了我们经常说的内存泄露 ...

  9. 转:检查c#代码内存泄露工具-CLR Profiler工具使用

    大家都知道.net有一套自己的内存(垃圾)回收机制,除非有一些数据(方法)长期占有内存不随着垃圾回收功能而释放内存,这样就造成了我们经常说的内存泄露.内存持续增长得不到释放等问题导致APS.NET网站 ...

随机推荐

  1. 多线程之线程池Executor应用

    JDK1.5之后,提供了自带的线程池,以便我们更好的处理线程并发问题. Executor类给我提供了多个线程池创建的方式: 创建固定的线程池 Executors.newFixedThreadPool( ...

  2. APlayer组件自制播放器

    .NET中使用APlayer组件自制播放器 2015-02-02 09:46 by xiaozhi_5638, 402 阅读, 9 评论, 收藏, 编辑 目录 说明 APlayer介绍 APlayer ...

  3. jQuery邮箱验证正则表达式验证邮箱合法

    if($.trim(email)==''||$.trim(email)=='邮    箱:'||$.trim(email)==null){ alert('邮箱不能为空!'); return false ...

  4. js页码生成库,一个适合前后端分离的页码生成器

    原文:js页码生成库,一个适合前后端分离的页码生成器 前言 上星期写的任务里面有需要进行分页的处理,git搜索了一番,没有觉得合适的,于是自己临时写了个分页的算法. 然后等闲下来的时候,决定把分页进行 ...

  5. libvlc media player in C# (part 2)

    原文 http://www.helyar.net/2009/libvlc-media-player-in-c-part-2/ I gave some simplified VLC media play ...

  6. 实现关闭ssh继续实施方案---tmux

    问题1:为什么ssh一个关闭.不再执行的程序 罪魁祸首:SIGHUP 信号 让我们来看看为什么关掉形式/断开将使程序被执行死. 在Linux/Unix在.有几个概念: 进程组(process grou ...

  7. 【Android开发日记】第一个任务Android Service!Service靴+重力感应器+弹出窗口+保持执行

    前言: 近期在写一个小程序,需求是手机摇一摇就弹窗出来.第一次使用了Service,学习了两天,实现了Service弹窗,开机启动,Service启动和销毁,Service保持一直执行. 满足了自己的 ...

  8. 【转】NuGet的安装与使用

    学习了一段时间的MVC,今天想自己尝试初步搭建一个MVC框架,结果新建MVC4.0(MVC3.0同样)项目时,弹出一个错误提示框,如下图.上网一搜,说是要安装一个第三方组件NuGet.刚接触MVC,更 ...

  9. [ACM] POJ 2506 Tiling (递归,睑板)

    Tiling Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 7487   Accepted: 3661 Descriptio ...

  10. [Android] Volley源代码分析(五岁以下儿童)Q \\ u0026一个

    Volley源代码分析系列那里一段时间,告诉我,有许多私人留言,同时一些问题抛出.对于一些简单的问题,我们跳,这两天被连接到朋友@smali提出的问题.告诉我你不得不赞叹查看源代码时的详细程度,大家一 ...