分析 Windows 应用商店应用程序中的 Visual C++、Visual C# 和 Visual Basic 代码的性能数据
本主题介绍 Microsoft Visual Studio Express 2012 for Windows 8 分析工具的报告视图中提供的 Visual C++、Visual C# 和 Visual Basic 代码的性能数据。若要收集 Visual C++、Visual C# 和 Visual Basic 性能数据,请参见以下主题之一:
如何分析本地计算机上的 Windows 应用商店应用程序中的 Visual C++、Visual C# 和 Visual Basic 代码
如何收集 Visual C++、 Visual C# 和 Visual Basic 元素的性能数据在本地计算机的一个 JavaScript app
如何分析远程设备上的 Windows 应用商店应用程序中的 Visual C++、Visual C# 和 Visual Basic 代码
在本主题中
本主题包含以下各节:
性能数据的类型
仅我的代码
性能报告视图的类型
性能报告视图
“摘要”视图
“函数详细信息”视图
“调用关系树”视图
“调用方/被调用方”视图
“模块”和“函数”视图
“行”视图
自定义数据网格视图
打开分析报告文件
从 Visual Studio IDE 中停止某个分析运行后,将自动在一个文档中显示性能数据。
若要打开由 VSPerf 命令行工具生成或在上一次分析运行后保存的分析报告 (.vspx) 文件,请执行下列操作:
如有必要,请打开 Visual Studio。
在**“文件”菜单上,选择“打开文件”**。
在**“打开文件”**对话框中,导航至分析报告文件所在的文件夹,然后选择该报告文件。
性能数据的类型
Visual Studio Express 2012 for Windows 8 探查器使用采样技术收集 Visual C++、Visual C# 和 Visual Basic 代码的性能数据。基于处理器时钟,每隔一段时间,探查器即捕获当前活动函数的快照,即“调用堆栈”。调用堆栈上的活动函数或者执行其自身代码,或者等待执行其所调用的函数。对于被采样调用堆栈中的每个函数,探查器按如下方式向函数分配采样值:
如果函数执行其自体内(但非子函数中)的代码,则增加该函数的**“非独占”和“独占”**样本计数。
如果函数等待子函数返回,则仅增加该函数的**“非独占”**样本计数。
函数的分析数据包括为该函数收集的样本的绝对数量,以及这些样本数占分析运行期间收集的样本总数的百分比。为两组计时值计算该数据:
根据当函数在调用堆栈上时为该函数收集的样本总数(包括在执行子函数时收集的样本数)计算**“非独占”**值。分析被采样的调用堆栈后,增加该调用堆栈上所有函数的非独占样本数。
根据当函数在执行其自身代码时为该函数收集的样本总数计算**“独占”**值。“独占”值不包括在执行子函数时收集的样本数。分析被采样的调用堆栈后,仅增加执行其函数体内代码的函数的独占样本计数。
性能报告视图的类型
分析报告视图以两种方式显示数据:
调用关系图视图显示有关执行路径上下文中函数的信息。
“摘要”窗口上的**“热路径”**树显示分析运行期间占用时间最多的最大样本数的执行路径。
“调用关系树”视图是分析运行期间采样的所有执行路径的一个调用关系图。
“函数详细信息”和“调用方/被调用方”视图侧重于所选函数,显示调用所选函数的函数及所选函数调用的函数。
调用关系图视图可帮助您发现算法中的性能问题。
函数列表视图在一个表中显示函数的性能数据。可通过选择某个数据列,对函数进行排序。
“摘要”页上的**“大部分时间单独工作的函数”**列表显示分析运行期间收集的独占样本数最大的函数。
“模块”视图按各个函数所属的 .dll 或 .exe 文件将这些函数进行分组。
“函数”视图是一个单独的列表,其中只有函数。
“行”视图显示在收集样本时执行的函数语句的性能数据。
可通过选择某个函数,然后从**“当前视图”**下拉列表中选择一个新视图,在视图之间进行导航。
仅我的代码
默认情况下,探查器在创建报告时使用**“仅我的代码”功能。探查器在分析调用堆栈信息时,确定调用堆栈上的某个函数是您的代码的成员还是系统代码的成员(如 .NET 基类库中的方法)。启用“仅我的代码”**后且该函数调用系统代码时,探查器分析将为调用堆栈收集的所有后续样本都加在第一个系统调用的独占和非独占值上。因此,所有系统调用集中在一起,变成第一个系统调用,这样可帮助您集中精力优化您自己的代码。
若要更改默认的“仅我的代码”行为和查看所有对系统调用的调用,请执行下列操作:
在**“工具”菜单上,选择“选项”**。
在**“选项”对话框中,选择“性能工具”,然后选择“常规”**。
在**“仅我的代码”组中,清除“对探查器报告启用‘仅我的代码’(采样)”**复选框。
性能报告视图
“摘要”视图
“摘要”页提供两个有关分析数据的视图,一般可为您指出最适合进行性能优化的部分。
**“热路径”**树显示分析运行期间样本数最多的调用堆栈。了解此算法占用时间如此之多的原因即便于进行优化。
**“大部分时间单独工作的函数”**列表显示十个使用独占时间最多的函数。可通过优化函数代码或减少调用这些函数的次数,迅速地显著提高性能。
若要打开函数的“函数详细信息”视图,请在“摘要”视图中选择某个函数名称。
“函数详细信息”视图
**“开销分布”**条形图表示所选函数与执行所选函数的调用函数之间的关系,以及所选函数与其调用的其他函数之间的关系。
“调用函数”条显示调用所选函数的函数。调用函数块的大小指示调用函数所用时间占所选函数总执行时间的百分比。
**“所选函数”条指示所选函数执行其自身代码(“函数体”**块)所用时间占总执行时间的比率以及执行所选函数调用的其他函数所用的时间。
**“被调用函数”**条显示被所选函数调用的其他函数。被调用函数块的大小指示被调用函数中所用时间占被调用函数总执行时间的百分比。
可选择调用函数或被调用函数以使该函数成为所选函数。
“调用关系树”视图
可使用“调用关系树”视图浏览在应用程序中遍历的函数执行路径。关系树的根是应用程序的入口点。每个函数节点都列出它调用的所有函数以及有关这些函数调用的性能数据。“调用关系树”视图中的函数值对应于调用关系树中父函数所调用的其他函数实例。百分比值是函数实例值的时间与分析运行总执行时间之比。
若要集中关注“调用关系树”视图的一个节点,请选择该节点,然后在快捷菜单上选择**“设置根”。设置根节点后,将从视图中排除所选节点的子树之外的所有其他条目。若要将根节点重置回原始节点,请在快捷菜单上选择“重置根”**。
“调用关系树”视图列
列名称 |
说明 |
---|---|
非独占样本数 |
为调用关系树中父函数调用的其他函数的实例收集的样本数。该样本数包括为该函数调用的其他函数收集的样本。 |
独占样本数 |
为调用关系树中父函数调用的其他函数的实例收集的样本数。该样本数不包括为该函数调用的其他函数收集的样本。 |
非独占样本数百分比 |
为父函数调用的其他函数的实例收集的样本数占分析运行期间收集的样本总数的百分比。该值包括为该函数调用的其他函数收集的样本。 |
独占样本数百分比 |
为父函数调用的其他函数的实例收集的样本数占分析运行期间收集的样本总数的百分比。该值不包括为该函数调用的其他函数收集的样本。 |
模块名 |
函数所在模块(.dll 或 .exe)的名称。 |
“调用方/被调用方”视图
“调用方/被调用方”视图是“函数详细信息开销分布”条形图中包括所有计时详细信息在内的数据的树表示形式。使用“调用方/被调用方”视图可调查所选函数与调用它的函数和它调用的函数之间的关系。“调用方/被调用方”视图由三个网格组成。
中间网格中显示的**“当前函数”显示有关所选函数的分析信息。这些值包括从对该函数的所有调用得到的样本。顶部网格中显示“调用当前函数的函数”,而底部网格中显示“由当前函数调用的函数”**。当前函数的值是从对该函数的所有被采样调用得到的总数。调用和被调用函数的值仅包括其调用所选函数或被所选函数调用时为该函数收集的样本。
若要在函数的调用关系树中导航,请双击某个调用或被调用函数。这将使所选函数成为新的所选函数,并显示它的调用方和被调用函数。
“调用方/被调用方”视图列
列名称 |
说明 |
---|---|
非独占样本数 |
|
独占样本数 |
|
非独占样本数百分比 |
|
独占样本数百分比 |
|
“模块”和“函数”视图
“模块”和“函数”视图显示分析报告中函数的分析数据的详细信息。“模块”视图按 JavaScript 函数所属的 .js 源文件划分这些函数。其他函数按模块(如 .dll)列出。“函数”视图不按层次结构列出所有函数。在“模块”视图中通常比在“函数”视图中更容易找到您自己的代码,但您可能会发现在“函数”视图中更容易比较各个函数。
“模块”和“函数”视图列
列名称 |
说明 |
---|---|
非独占样本数 |
当函数在调用堆栈上时收集的样本数。该样本数包括为该函数调用的其他函数收集的样本。 |
独占样本数 |
当函数在执行其自身代码时收集的样本数。独占样本不包括在该函数调用的其他函数执行时收集的样本。 |
非独占样本数百分比 |
当函数在调用堆栈上时收集的样本数占分析运行期间收集的样本总数的百分比。 分子是函数的“非独占样本数”。 分母是分析运行期间收集的样本总数。 |
独占样本数百分比 |
为函数收集的样本数占分析运行期间收集的样本总数的百分比。该值不包括为该函数调用的其他函数收集的样本。 |
“行”视图
采样数据的“行”视图列出分析运行期间收集样本时所执行语句的性能数据。在源文件中,一个语句可分散在多行中,而一行也可包括多个语句。
列名称 |
说明 |
---|---|
非独占样本数 |
分析运行期间为行收集的样本数。该样本数包括为行调用的函数收集的样本。 |
独占样本数 |
分析运行期间为行收集的样本数。该样本数不包括为行调用的函数收集的样本。 |
非独占样本数百分比 |
为行收集的样本数占分析运行期间收集的样本总数的百分比。该值包括为行调用的函数收集的样本。 |
独占样本数百分比 |
为行收集的样本数占分析运行期间收集的样本总数的百分比。该值不包括为行调用的函数收集的样本。 |
源行开始 |
源文件中收集此样本的的起始行号。 |
源字符开始 |
源文件行中收集此样本的起始字符的偏移量。 |
源行结束 |
源文件中收集此样本的的结束行号。 |
源字符结束 |
源文件行中收集此样本的结束字符的偏移量。 |
自定义数据网格视图
可添加或移除数据列,还可更改列的显示顺序。打开表的某个标头行的快捷菜单,然后选择**“添加/移除列”**。选中要查看的列的复选框,然后清除要隐藏的列的复选框。使用箭头按钮移动所选列。
其他分析数据列
列名称 |
说明 |
---|---|
函数地址 |
函数在内存中的地址。 |
函数行号 |
此函数在源文件中的起始行号。 |
源文件 |
此函数的定义所在的源文件。 |
模块名 |
函数所在模块的名称。 |
模块路径 |
函数所在模块的路径。 |
进程 ID |
分析运行的进程 ID (PID)。 |
进程名 |
进程的名称。 |