65.9K
CodeProject 正在变化。 阅读更多。
Home

CLR 性能分析演示

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.55/5 (7投票s)

2008年11月3日

CPOL

4分钟阅读

viewsIcon

43833

CLR 分析 ASP.Net 应用程序的步骤

概述

CLR 分析器使您能够查看进程的托管堆,并调查垃圾收集器的行为。使用该工具中的各种视图,您可以获得有关应用程序的执行、分配和内存消耗的有用信息。
使用 CLR 分析器,您可以识别分配过多内存、导致过多垃圾收集以及占用内存时间过长的代码。

CLR 分析器视图

已分配类型直方图、重定位类型直方图、按地址的对象、按年龄的直方图、分配图、程序集、模块、函数和类图、堆图、调用图、时间线、调用树视图。在本文中,我们将讨论已分配类型直方图和按年龄的直方图。

视图 描述
已分配类型直方图 为您提供应用程序生命周期内分配了哪些对象类型(按分配大小)的高级视图。此视图还显示在大对象堆中分配的那些对象(大于 85 KB 的对象)。此视图允许您单击图形的各个部分,以便您可以看到哪些方法分配了哪些对象。
按年龄的直方图 允许您查看托管堆上对象的生存期。
分配图 以图形方式显示对象分配方式的调用堆栈。您可以使用此视图来
  • -查看每个方法分配的成本。
  • -隔离您不期望的分配。
  • -查看方法可能存在的过度分配。

分析 ASP.NET 应用程序所涉及的步骤

  1. 运行 CLR Profiler.exe
    出现以下屏幕

    _1_Start_Screen.JPG

    确保选中以下复选框

    • 正在分析
    • 分配
    • 调用
  2. 转到文件菜单。从可用的选项中,选择“分析 ASP.NET”。这将停止 IIS 管理服务,从而停止其他依赖服务(万维网发布服务)。然后重新启动万维网发布服务。然后出现以下屏幕

    _2_StartAsp1.JPG

    _3_StartAsp2.JPG

    _4_Second_Screen.JPG

  3. 此时,在浏览器中启动应用程序(打开一个新的浏览器窗口)。注意:不要刷新已经打开的应用程序。
  4. 接下来,出现以下屏幕

    _5_Third_Screen.JPG

    浏览您要分析的页面,然后单击“杀死 ASP.NET”。

    _6_kill1.JPG

    _7_Kill2.JPG

  5. 最后,生成以下摘要报告。
    通过单击相应的直方图按钮可以查看各种可用选项。

    _8_Summary.jpg

示例分析

示例应用程序的基线分析

分析摘要的快照

_8_Summary.jpg

单击与“已分配字节”关联的直方图 已分配字节直方图第 1 部分

_10_AllocatedBytesBaseline1small.JPG

表示不同对象类型的颜色在窗口的右侧指定。当您滚动浏览这些条时,它会显示对象类型、该对象占用的总内存、创建的总实例数以及实例的平均大小。

已分配字节直方图第 2 部分

_11_AllocatedBytesBaseline2small.JPG

正如我们在这里看到的,已经创建了 168,037 个大小 < 64 字节的字符串实例。其中一个主要原因是,当我们连接字符串时,会创建一个具有相同名称的新字符串实例,但旧实例不会被删除。为了改善这种情况,我们可以使用字符串生成器对象而不是字符串。

首先,让我们修改一个用户控件中的一小段代码(即使用字符串生成器而不是字符串)。以下代码片段描述了该更改。代码中的一个属性

/// <summary>
/// Gets the selected text , the items are separated by comma
/// </summary>
public  string SelectedText
{
    get
    {
        string selText = string.Empty;
        foreach (System.Web.UI.WebControls.ListItem li in DDList.Items )
        {
            if (li.Selected )
            { selText += li.Text + ","; }
        }
        if (selText.Length > 0)
        	selText = selText.Length > 0 ? selTExt.Substring(0,selText.Length-1) : selText;
        return selText;
    }
    set
    {	_SelectedText   =  value;
    	DDLabel.Text    =  _SelectedText;
    	DDLabel.ToolTip =  _SelectedText;
    }
}

与上述相同的属性,但进行了必要的代码修改。

/// <summary>
/// Gets the selected text , the items are separated by comma
/// </summary>
public  StringBuilder SelectedText
{
    get
    {
        StringBuilder selText = new StringBuilder();
        foreach (System.Web.UI.WebControls.ListItem li in DDList.Items )
        {
            if (li.Selected )
            { selText.Append(li.Text).Append(','); }
        }
        if (selText.Length > 0)
        {
        	String strTemp;
        	strTemp = selText.ToString();
        	if (selText.Length > 0)
        	{
        		selText.Remove(0, selText.Length);
        		selText.Append(strTemp.Substring(0, strTemp.Length - 1));
        	}
        }
        return selText;
    }
    set
    {	_SelectedText   =  value;
    	DDLabel.Text    =  _SelectedText;
    	DDLabel.ToolTip =  _SelectedText;
    }
}

在整个编码过程中更改了两个属性。完成更改后,运行分析器。代码更改后应用程序的分析

分析摘要的快照

_14_ProfiledSummary.jpg

从 172,365,764 到 85,497,789,已分配字节部分发生了显着变化。同样,重新定位的字节数已从 32,073,455 减少到 14,284,343。

用“字符串生成器”替换“字符串”是改进内存管理的方法之一。也可以使用其他技术,例如缓存、池、有效的会话处理等。

已分配字节直方图第 1 部分

_15_AllocatedBytesSBBaseline1small.JPG

已分配字节直方图第 2 部分

_16_AllocatedBytesSBBaseline2small.JPG

比较

代码更改之前的总已分配字节数:172,365,764
代码更改后:85,497,789
总已分配字节数的百分比改进:50.397

代码更改之前创建的大小 <64 字节的字符串实例:168,037 (7.1 MB) 平均 44 字节。
代码更改后:52,898 (2.4 MB) 平均 46 字节。

创建的字符串实例(小于 64 字节)的百分比改进:68.52

© . All rights reserved.