.NET性能分析最佳实践之:如何找出使用过多内存的.NET代码(基础篇)
.NET性能分析最佳实践之:如何找出使用过多内存的.NET代码(基础篇)
在.NET应用中一个常常影响性能的因素就是代码消耗了过多的内存。很多的开发人员在编写代码的过程中常常不会关注性能,从而使得应用程序中到处存在性能瓶颈。很多的时候,开发人员关注的总是代码的执行时间的长短,而把真正的性能问题丢掉了一边。在本篇文章中,我们将会找出代码中的哪些功能消耗了多少内存。
本篇文章比较简单,我们会主要详细的介绍CLR Profiler这个工具。
系列文章:
.NET性能分析最佳实践之:如何找出使用过多内存的.NET代码(进阶篇
本篇议题如下:
基础篇:详解介绍Profiler的使用
进阶篇:调用Profiler的API进行
基础篇:详解介绍Profiler的使用
大家可以从这里从微软的站点下载CLR Profiler。一旦下载CLR Profiler之后,我们就可以解压,然后运行Bin文件夹中的“CLRProfiler.exe”。
首先我们来介绍一下CLR Profiler的功能。
CLR Profiler确实是一个不错的工具,通过使用它,我们可以了解一个.NET应用程序到底是如何使用内存的,基本上面它的功能可以分为两类,如图所示:
1. 对一个.NET应用中的内存是如何分配的给出一个完整的描述。所以,我们可以看到每一种类型,方法所占用的内存情况。
2. 它告诉我们一个方法被调用了多少次。
这里需要注意的就是:不要再生产环境或上面的服务器站点中运行CLR Profiler,因为它会严重的影响程序的影响。例如,如果我们的应用程序中包含两个方法,fun1和fun2,此时当我们运行CLR Profiler的时候,它会将一些逻辑注入到应用程序中,通过下面的一个图就可以很清楚的看出这个问题:
说了这么多,我们还是来看看,如何使用CLR Profiler。
首先,在使用CLR Profiler之前,我们要清楚:要使用这个工具来干嘛?基本上,有两点理由:查看内存的分配与使用的情况;查看方法被调用次数。
启动了CRLProfiler.exe之后,选择要检查的程序,如下图:
此时,应用程序就开始运行,我们就可以在Profiler中看到一些信息,例如应用程序占用的内容,每一代对象占用的大小等,如下:
其实上面的那个应用程序非常的简单,只是作为一个demo演示而言。上面的程序的功能就是在一个按钮的事件中调用了两个方法:UseSimpleStrings和UseStringBuilders。这个两个方法都是在拼接字符串(这也是常常被用来做例子的一个场景),我们分别让它们拼接1000个字符串,如下:
其中UseSimpleStrings如下:
UseStringBuilders如下:
现在,我们可以尝试着使用Profiler去看看每个方法使用多少的内存。我们在程序中点击按钮,好让Profiler去收集信息。然后,我们在点击Profiler的“histogram”按钮,此时我们就可以看到程序中的每一种类型的内存占用情况,如下:
如果我们想看每一个方法在运行过程中占用的内容,可以点击“Allocation Graph”,如下:
通过这个操作,我们可以看到下面的图:
乍一看,可能感觉界面非常的混乱,特别是在应用程序很大的时候。为了更加看到我们想看的方法,我们可以通过在界面的中点击右键,点击“Find Routine”,然后选择输入过滤的条件,如下:
这样就可以快速的定位,如下:
然后在方法上面双击,就进一步的展开,查看细节,如下:
在上图中,我们只是看到了“UseSimpleStrings”方法的使用内存的情况,因为这个界面显示的信息比较的粗糙,只是把一些内存使用比较多的方法列出来了,我们可以通过点击“0(everything)”查看所以的方法,此时看到如下:
通过上面的图,我们一目了然的直到内存的使用情况。