预览加载中,请您耐心等待几秒...
1/10
2/10
3/10
4/10
5/10
6/10
7/10
8/10
9/10
10/10

在线预览结束,喜欢就下载吧,查找使用更方便

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

使用VisualStudio分析器找出应用程序瓶颈 在过去十年间,涌现了许多新的软件技术和平台。每种新技术都要求掌握专门的知识才能创建出性能良好的应用程序。现在,由于各种Internet技术(如博客)使失望的用户可轻松地否定您的应用程序,因此您确实需要将性能放到首要位置。在计划早期,就应添加响应性能要求并创建原型来确定可能的技术限制。在整个开发过程中,还应衡量应用程序的各个性能方面以发现可能的性能下降,同时确保速度较慢情形下的测试人员文件并跟踪其错误。 即使拥有最好的计划,仍必须在产品开发过程中调查性能问题。在本文中,我们将向您展示如何使用VisualStudio®TeamSystemDevelopmentEdition或VisualStudioTeamSuite来确定应用程序中的性能瓶颈。将通过演练一个示例性能调查来向您介绍VisualStudio分析器。请注意,尽管我们在本文中是使用C#来编写代码示例,但是此处的大部分示例对于本机C/C++和VisualBasic®代码也同样有效。 应用程序分析 我们将使用先前提及的两个VisualStudio版本所附带的分析器。首先编写一个用于绘制Mandelbrot不规则图形的小型示例项目(如图1所示)。该应用程序不是非常有效,并且需要约10秒钟才能绘制出不规则图形。 Figure1性能测试的目标程序(单击该图像获得较大视图) 要开始调查,从VisualStudio2008的新“Analyze”(分析)菜单启动“PerformanceWizard”(性能向导)。在VisualStudio2005中,此功能可从“工具”|“性能工具”菜单获得。从而启动一个包含三个步骤的向导,其中第一步是指定目标项目或网站。第二步提供两种不同的分析方法:采样和检测。(有关这些分析方法的详细信息,请参阅“性能分析解释”侧栏。)现在,我们将选取默认值。 向导完成后,显示一个“PerformanceExplorer”(性能资源管理器)对话框并创建一个新的性能会话。此会话包含目标应用程序(在我们的示例中为Mandel)并且没有报告。要启动分析,单击工具窗口工具栏中的“LaunchwithProfiling”(启动并分析)按钮。 应用程序绘制完不规则图形后,立即关闭窗体停止分析。VisualStudio自动将一个新创建的报告添加到性能会话中并开始进行分析。分析完成后,VisualStudio分析器会显示“PerformanceReportSummary”(性能报告摘要),列出开销最大的函数(请参见图2)。报告以两种方式显示这些函数。第一种方式衡量所列出函数直接或间接执行的工作。对于每个函数,数字代表在函数主体及其所有子调用中收集的积累样本。第二个列表不计算在子调用中收集的样本。此摘要页面显示VisualStudio分析器在执行DrawMandel方法期间收集了30.71%的样本。剩余69%的样本则分散在其他各个函数间,在此就不加赘述。要了解更多有关报告选项的信息,请参阅侧栏“报告可视化选项”。 Figure2性能测试显示开销较大的函数调用(单击该图像获得较大视图) 请查看报告的“CallTree”(调用树)视图(如图3所示),“InclusiveSamples%”(包含样本%)列代表在函数及其子项中收集的样本。“ExclusiveSamples%”(独占样本%)列代表仅在函数主体中收集的样本。可看到DrawMandel方法直接调用Bitmap.SetPixel。尽管DrawMandel自身占据了总样本的30.71%,但VisualStudio分析器从Bitmap.SetPixel及其子项收集了64.54%的样本。其中Bitmap.SetPixel主体仅占0.68%(因此它并未显示在摘要页面上)。但是,Bitmap.SetPixel通过其子项产生了大部分处理。它才是应用程序的真正瓶颈。 Figure3被测应用程序的调用树示例(单击该图像获得较大视图) 显然地,Bitmap.SetPixel对于Mandel项目而言并非最佳。我们的应用程序需要一种更快的方式来访问窗体上的所有像素。幸运的是,位图类还提供有另一个有用的API:Bitmap.LockBits。此函数允许程序直接写入位图内存,从而减少了设置单个像素的开销。此外,为优化绘图,我们将创建一个纯整数数组并用每个像素的颜色值加以填充。随后,通过单个操作将该数组的值复制到位图中。 优化应用程序 性能分析解释 使用采样方法进行分析时,分析器以一种类似于调试程序的方式附加到正在运行的进程。然后,分析器会定期中断进程并检查哪个函数处于堆栈顶部以及该函数的代码路径。换句话说,VisualStudio分析器收集当前进程状态的样本。采样是一种非入侵式统计型分析方法。在函数