在开发.NET应用程序的过程中,经常会遇到代码执行效率低下或者占用系统资源过多的问题,即使代码是按照教科书编写的。这通常是因为.NET库在后台执行了比预期更多的操作。为了解决这些问题,开发者需要一个能够深入分析代码性能的工具,而ANTS Profiler正是为此而生。
ANTS Profiler是一个专为.NET开发者设计的性能分析工具,它可以帮助开发者快速定位代码中的性能瓶颈,技术测试人员也使用它来将错误定位到具体的代码行或确定优化的范围。
ANTS Profiler能够在安装后的5分钟内识别出.NET应用程序中的慢代码行,让可以专注于编写代码。此外,该程序还可以用于:
ANTS Profiler可以对Windows应用程序、ASP.NET Web应用程序、COM+应用程序和.NET Web服务进行性能分析。它支持使用VB.NET、C#、C++(托管)以及.NET框架支持的其他任何语言(包括超过40种语言)编写的应用程序。
当开发了一个应用程序并需要查看它是否符合预期的性能时,ANTS Profiler是一个理想的工具。下面的截图和解释将引导完成性能分析的步骤,这些步骤基于一个演示.NET桌面应用程序Mandelbrot.exe,该程序绘制了一个名为Mandelbrot Set的分形数学函数。
Mandelbrot应用程序使用了两种计算图像的替代方法:“快速”和“慢速”。这个示例展示了如何使用ANTS Profiler识别应用程序中最耗时的部分。它将介绍主要功能,并展示如何使用ANTS Profiler分析自己的应用程序。
首先启动ANTS Profiler,并使用“Profiler Project Wizard”来指定想要执行的性能分析类型。
选择“Profile performance”,因为想要调查应用程序中不同方法的执行时间,然后点击“Next”按钮继续到向导的下一个屏幕。
现在需要指定想要分析的.NET应用程序类型。由于Mandelbrot程序是一个桌面应用程序,选择“.NET desktop application”,然后点击“Next”按钮继续。
在“Profiler Project Wizard”的下一步中,需要指定应用程序的可执行文件,所以浏览到文件Mandelbrot.exe的位置。最后一步允许指定应用程序中要分析的方法。在这种情况下,选择“Only.NETmethods that have source code”。由于这个应用程序是一个带有源代码的调试构建,只对带有源代码的方法进行分析。点击“Finish”并退出向导后,就可以开始分析了。
一个对话框会出现,询问是否想要开始分析应用程序。点击“Yes”将启动应用程序。
当开始分析时,ANTS Profiler会启动应用程序并使其处于活动状态,这样就可以运行想要分析的应用程序部分。在Mandelbrot集窗口中,点击“慢速”按钮选择慢速算法,然后点击“绘制Mandelbrot集”按钮来绘制图像。
图像绘制完成后,点击关闭按钮退出Mandelbrot.exe应用程序。这会自动停止ANTS Profiler的分析,并显示应用程序结果的摘要。摘要包含了应用程序的基本信息以及10个最慢的代码行、10个最慢的方法和10个带有子方法的最慢方法。可以点击摘要中的任何链接导航到特定的方法或源代码行。当点击摘要中任何最慢的代码行时,源代码面板会自动更新以显示相关的源代码和时间。
点击了摘要中“最慢的代码行”列表中的Mandelbrot.Algorithm.Evaluate()方法:
点击摘要中任何最慢的代码行会自动更新源代码面板以显示相关的源代码和时间。
在这个例子中,很明显几乎所有的时间都花在了EvaluateUsingComplexNumbers()方法上,这由红色条表示。可以通过在源代码面板顶部的下拉菜单中选择它来显示所选方法的源代码。
在确定了大部分时间都花在了EvaluateUsingComplexNumbers()方法上之后,可能会考虑是否可以通过将该方法编写为使用双精度浮点数而不是复数来提高其运行效率。
如果对摘要中未列出的方法感兴趣,可以转到“All methods”面板以查看所有分析过的方法的网格视图。
在查看“All methods”面板时,可以按想要的方式排序、筛选和分组方法。
当点击“All methods”或“Summary”面板中的任何方法时,层次结构面板会更新以显示该方法及其父级和子级的细节。点击网格中的Form1.DrawMandelbrot()方法以获取更多关于此方法的信息。从层次结构面板中,可以看到命中次数为1,这意味着该方法执行了一次。
“带有子方法的时间”比“时间”要大得多,这表明该方法的大部分时间都花在了子方法上。
双击任何父级或子级可以深入了解时间花费的确切位置。
可以看到,大部分时间都花在了Algorithm.Evaluate()方法上,该方法执行了115104次,每次对应图像中的一个像素。可以双击“Children”列表中的Algorithm.Evaluate(),将其设置为当前显示的方法。然后双击其子级列表中的Algorithm.Evaluate UsingComplexNumbers()显示时间花费在五个复数例程上。