Sun Studio 12:性能分析器

源代码行度量

每行可执行代码的源代码度量都会在固定宽度的几列中显示出来。这些度量与函数列表中的度量相同。您可以使用 .er.rc 文件更改实验的缺省值;有关详细信息,请参见设置缺省值的命令。您还可以在分析器中使用“设置数据表示”对话框更改显示的度量和突出显示的阈值;有关详细信息,请参见设置数据表示选项

带注释的代码在源代码行级别显示应用程序的度量。该度量是通过使用记录在应用程序调用栈中的 PC(program count,程序计数),并将每个 PC 映射至源代码行的方式生成的。要生成带注释的源文件,分析器首先确定在特定目标模块(.o 文件)或装入对象中生成的所有函数,然后从每个函数扫描所有 PC 的数据。为了生成带注释的源代码,分析器必须能够找到并读取目标模块或装入对象来确定从 PC 至源代码行的映射,此外,它还必须能够读取源文件来生成要显示的带注释的副本。分析器依次在以下缺省位置搜索源文件、目标文件和可执行文件,并在找到具有正确基本名称的文件时停止:

缺省位置可以使用 addpathsetpath 指令更改,也可以使用分析器 GUI 更改。

如果使用由 addpath setpath 设置的路径列表找不到文件,则可以使用 pathmap 命令指定一个或多个路径重映射。使用 pathmap 命令,可以指定 old-prefixnew-prefix。在以 old-prefix 所指定的前缀开头的源文件、目标文件或共享对象的任何路径名中,旧的前缀将由 new-prefix 所指定的新前缀替代。然后,使用所得到的路径查找文件。可采用多个 pathmap 命令,并逐一尝试,直到找到文件为止。

编译过程要经过很多阶段,这取决于请求的优化级别,并且会发生转换,该转换会使指令到源代码行的映射变得混乱。对于某些优化,源代码行信息可能完全丢失,而对于其他优化,源代码行信息则可能变得混乱。编译器依赖各种试探操作来跟踪指令的源代码行,而这些试探操作不是绝对无误的。

解释源代码行度量

指令的度量必须解释为在等待执行指令时累积的度量。如果记录事件时执行的指令来自与叶 PC 相同的源代码行,则度量可以解释为由于执行了该源代码行的缘故。但是,如果叶 PC 与所执行的指令来自不同的源代码行,那么叶 PC 所属源代码行的度量中至少有一些度量必须解释为在等待执行此代码行时累积的度量。例如,当一个源代码行上计算的值被用在下一个源代码行上时。

当执行过程中存在严重的延迟(如高速缓存未命中或资源队列停止)或指令等待前一个指令返回结果时,如何解释度量的问题是最重要的问题。在这些情况下,源代码行的度量看上去很高(高得不太合理),应该查看代码中的其他行以找出导致高度量值的行。

度量格式

表 8–1 中说明了可能出现在带注释的源代码行上的四种度量格式。

表 8–1 带注释的源代码度量

度量 

含义 

(空白) 

程序中没有 PC 对应于该代码行。此情形应该始终适用于注释行,并且在下列情况下适用于出现的代码行: 

  • 所出现的代码段的所有指令已在优化期间删除。

  • 代码在其他地方重复,并且编译器执行通用子表达式识别并标记带有其他副本代码行的所有指令。

  • 编译器用不正确的行号来标记该行的指令。

0.

程序中的某些 PC 被标记为从该代码行派生,但没有数据引用这些 PC:它们从不会位于被抽样统计或被跟踪的调用栈中。0. 度量不表示该行不执行,只是表示该行不以统计方式显示在分析数据包或记录的跟踪数据包中。

0.000

该行至少有一个 PC 出现在数据中,但是计算的度量值舍入为零。 

1.234

归属于该行的所有 PC 的度量总计达到了显示的非零数值。