练习 1.3:识别性能瓶颈
在开始之前,必须完成练习 1.2:收集性能和覆盖数据。
性能瓶颈是代码中使执行速度降低或执行停止的区域。在此过程中,使用“性能调用图”视图来识别 sort 程序中的瓶颈。
要查找瓶颈:
- 在“概要分析监视器”中,右键单击“概要分析”资源,然后选择打开方式 > 性能调用图。
缺省情况下,“性能调用图”视图显示以下信息:
- 概要分析运行中 20 个消耗时间最长的节点以及表示整个运行的累积时间的过程节点。在此示例中,根据状态行上的可视统计信息,总共只有 17 个节点,并且这 17 个节点都显示出来了。节点可以表示方法、过程或线程。
- 概要分析运行过程中程序的动态调用结构,通过链接节点的连接线(弧线)显示。越粗的线表示调用路径消耗的时间越多。
技巧:右键单击节点以显示一个菜单,该菜单让您可以专用于显示节点以及它的子代(子树),或者采用其它方法处理显示。这些菜单命令允许您简化大量数据,这些数据甚至是为小型应用程序收集的。
- 在图形上方的“突出显示”字段中,以根为起点的最长路径处于选中状态。
以根为起点的最长路径突出显示向您显示应用程序的当前运行中消耗时间最长的调用路径。尤其是,它采用以下方法更改调用图显示:
- 程序中的消耗时间最长的节点处于选中状态。在示例中,此节点是类 Sort 中的方法 quick。
- 从所选节点到“过程”节点的调用路径(它表示整个运行的总时间)突出显示。
- 注意,调用图中还有一个 bsort 方法,它表示冒泡排序算法。从线的粗细可以看出,此运行中 bsort 执行情况比 qsort 要好。
获取其它性能信息
平台中的“性能调用图”视图和其它视图都提供了有关应用程序性能的其它信息。
可以采用下列方法来获取其它性能数据:
- 要了解 Sort.quick 如何执行,将光标暂停在 Sort.quick 节点上方。将出现工具提示,显示的是方法的统计信息。注意发出许多调用的方法。
- 要获取方法的数据的详细图形显示,双击节点。“方法详细信息”视图打开。
- 在“方法详细信息”视图中,查看“调用者”窗格。注意该方法被 Sort.Qsort 调用一次,但它调用自身数千次。这种自身调用是勿庸置疑的;快速排序通常需要大量递归调用。但是,如果调用相对需要非常长的时间就值得怀疑了。
- 要检查所有方法的可排序列表,请右键单击概要分析资源,然后选择打开方式 > 方法统计信息。
单击列标题基本时间以根据当前运行过程中在每个方法中所花的时间来对方法进行排序。可以看到 quick 比冒泡排序方法
bsort 慢很多。
现在,您已经验证了 quick 方法消耗的时间比预料中的多。还了解了如何从“性能调用图”和“方法详细信息”视图获取性能信息。在您检查代码并指出需要进行修改的地方时,这些信息非常重要。
但是,在检查代码之前,还应了解代码中是否存在未被执行的任何方法。这种检查使我们更好地了解应用程序的作用域,还将指示是否存在此程序可能包含的任何备用路径。
您可以开始进行练习 1.4:检查代码覆盖来确定是否存在任何未执行的方法以及备用路径了。