演练:分析应用程序
更新:2007 年 11 月
此演练演示如何分析应用程序来识别性能问题。
在本演练中,您将逐步完成分析托管应用程序的过程,使用取样和检测来隔离并识别应用程序中的性能问题。
在本演练中,您将执行以下步骤:
通过使用取样方法分析应用程序。
分析取样分析结果,找出并解决性能问题。
通过使用检测方法分析应用程序。
分析检测分析结果,找出并解决性能问题。
先决条件
Microsoft Visual Studio 2005 Team System.
C# 的理解程度为中等。
PeopleTrax 示例(分析工具) 的副本。
若要使用分析提供的信息,最好有调试符号信息。
使用采样方法分析
取样是一种分析方法,它定期对相关进程进行轮询,以确定活动函数。所得数据提供当对进程进行取样时相关函数位于调用堆栈顶部的频率的计数。
通过使用取样方法分析应用程序
在 Microsoft Visual Studio 2005 中打开 PeopleTrax 解决方案。
PeopleTrax 解决方案现在出现在解决方案资源管理器中。
在“分析”菜单上,单击“启动性能向导”。
将出现性能向导。
从“可用目标”下拉列表中选择 PeopleTrax,然后单击“下一步”。
单击“取样”,然后单击“下一步”。
单击“完成”。
将项目配置设置设为“发布”。
建议使用发行版本来检测应用程序中的性能问题。
建议使用发行版本进行分析的原因是调试版本将附加信息编译到其中,这可能降低性能,从而无法准确演示性能问题。
发行版本不会自动向您提供符号信息。若要配置您的版本以便可在探查器性能报告中看到符号信息,请参见 /Z7、/Zi、/ZI(调试信息格式)和如何:引用 Windows 符号信息。
在“性能资源管理器”工具栏上,单击“启动”。
Visual Studio 2005 生成项目并开始分析应用程序。将出现“PeopleTrax”应用程序窗口。
单击“获取 People”。
单击“导出数据”。
将打开“记事本”并显示一个包含从“PeopleTrax”导出的数据的新文件。
关闭“记事本”,然后关闭“PeopleTrax”应用程序。
Visual Studio 2005 将生成一个性能会话报告 (*.vsp) 并自动加载它。
分析取样分析结果
在“探查器”窗口工具栏中,打开报告视图下拉框,然后选择报告的“函数”视图。
右击数据网格,然后单击“添加/移除列”。
将出现“添加/移除列”对话框。
从列的列表中,选择“源文件名”,然后单击“确定”。
在数据网格上,单击“源文件名”列,对数据网格进行排序。
通过对此列进行排序,适用于 PeopleTrax 解决方案的所有行都将被分组。
定位显示 PeopleTrax 解决方案的数据的行。
检查这些行以后,您将看到对下列函数的取样比对 PeopleTrax 解决方案的其他部分的取样更频繁。
PeopleTrax.Form1.GetPeopleButton_Click
将焦点放置在“GetPeopleButton_Click”事件上。
右击“PeopleTrax.Form1.GetPeople_Click”行,然后单击“查看源”。
Form1.cs 将在代码编辑器中打开,同时指针将出现在“GetPeopleButton_Click”事件中。
检查“GetPeopleButton_Click”事件的源代码。
检查完此代码后,您可以找出需要优化的地方:
如果要使用“ListView.ListViewItemCollection”类的“Add”方法一次添加一个项,可以使用“BeginUpdate”方法防止控件在每次添加项时重新绘制列表视图。在完成将项添加到控件的任务后,请调用“EndUpdate”方法,以使列表视图能够重新绘制。在向控件添加大量项时,这种添加项的方法可以防止列表视图在绘制时出现闪烁。另外,此方法还可以缩短填充列表视图所需的时间。
App.Config 中的默认设置为 1500 个名称。
设置列表视图项的前景色时,通过使用 KnownColor 枚举而不是在字符串中指定颜色并调用“Color.FromName”方法,可以提高性能。
此事件会调用一个名为“People.GetPeople”的函数,以检索要添加到列表视图中的名称数组。
右击对“GetPeople”的调用,然后单击“转到定义”。
检查完此代码后,您可以找出需要优化的地方:
由于需要重复访问用于检索 fullNames 和 companyNames 的新数组的代码,因此这些数组应创建一次并加以重用。
若要将这些问题区域替换为优化后的代码,请将 OPTIMIZED_GETPEOPLE 作为条件编译符号添加到 PeopleTrax 和 People 项目中。
在解决方案资源管理器中,右击 PeopleTrax 项目,然后单击“属性”。
将出现 PeopleTrax 项目属性窗体。
单击“生成”选项卡。
在“条件编译符号”文本框中,添加 OPTIMIZED_GETPEOPLE。
对于 People 项目,请重复步骤 18 - 20。
当出现提示时,请关闭项目属性窗体并全部保存。
建议您再次运行分析会话,即使有用户可见的性能改进。如果第一个问题掩盖了某些其他问题,则修复问题以后再次查看一下数据将很重要。
现在,通过使用检测方法分析应用程序。
使用检测方法分析
检测是一种分析方法,其中分析的二进制文件的特殊生成版本在检测模块中包含在函数入口和出口收集执行时间信息的探测函数。由于此分析方法比取样更具有侵略性,它将导致更多系统开销。检测的二进制文件也比调试或发布的二进制文件大,它们不能用于部署。
通过使用检测方法分析现有应用程序
在性能资源管理器中,从下拉列表中单击“检测”。
在性能资源管理器工具栏上,单击“启动”按钮。
Microsoft Visual Studio 2005 生成项目并开始分析应用程序。将出现“PeopleTrax”应用程序窗口。
单击“获取 People”。
PeopleTrax 数据网格将出现数据。
单击“导出数据”。
“记事本”将启动并显示一个包含来自 PeopleTrax 的人的列表的新文件。
关闭“记事本”,然后关闭“PeopleTrax”应用程序。
Microsoft Visual Studio 2005 将生成一个性能会话报告 (*.vsp)。
分析检测分析结果
在报告的“摘要”视图上,检查摘要表以找出哪个函数调用得最频繁以及应用程序执行最多的部分。
根据此信息,您将了解到应用程序在运行“System.String.Concat”操作时花费了大量时间。
在任意一个摘要表中双击“System.String.Concat”。
报告将切换到“函数”视图并突出显示“System.String.Concat”。
右击“System.String.Concat”行,然后单击“在调用方/被调用方视图中显示”。
报告将切换到“调用方/被调用方”视图,并显示此函数由“PeopleTrax.Form1.ExportData”调用。
右击“PeopleTrax.Form1.ExportData”,然后单击“查看源”。
Form1.cs 将在代码编辑器中打开,同时指针将出现在“ExportData”函数中。
检查“ExportData”函数的源代码。
检查完此代码后,您可能注意到没有对“System.String.Concat”的 literal 调用。然而,有几处使用了 += 操作数,该操作数被 IL 中对“System.String.Concat”的调用替换。对 .NET Framework 中的字符串的任何修改都将导致分配一个新的字符串。.NET Framework 包括一个“StringBuilder”类,它为字符串串联进行了优化。
若要用优化的代码替换此问题区域,请将 OPTIMIZED_EXPORTDATA 作为条件编译符号添加到 PeopleTrax 项目中。
在解决方案资源管理器中,右击 PeopleTrax 项目,然后单击“属性”。
将出现 PeopleTrax 项目属性窗体。
单击“生成”选项卡。
在“条件编译符号”文本框中,添加 OPTIMIZED_EXPORTDATA。
当出现提示时,请关闭项目属性窗体并选择“全部保存”。
当您再次运行应用程序时,您将看到明显的性能改进。建议您再次运行分析会话,即使有用户可见的性能改进。如果第一个问题掩盖了某些其他问题,则修复问题以后再次查看一下数据将很重要。