递归的影响

如果还没有为 synprog 收集性能数据,必须进行收集。相关说明参见为 synprog 示例收集数据。收集了性能数据之后,就必须打开实验 test.1.er

示例的此部分说明性能分析器如何将度量分配给递归序列中的函数。在抽样收集器收集的数据中,记录了每个函数调用实例,但在分析中,会汇集所有给定函数实例的度量。synprog 程序包含递归调用序列的两个示例:

这两种情况下,独占度量只属于完成实际工作的函数(real_recurse()bounce_a())。这些度量会作为相容度量传递到调用最终函数的每个函数中。

直接递归

  1. 在 [函数] 标签中,找到函数 recurse() 并将其选中。

    可以使用 [查找] 工具而无需滚动函数列表。

    函数 recurse() 有相容用户 CPU 时间,但其互斥用户 CPU 时间为零,因为 recurse() 只是调用 real_recurse()

    注意: 因为分析实验的实质是统计,所以在 synprog 上运行的实验可能会在 recurse() 中记录一个或两个概要事件,recurse() 可能会显示较小的互斥 CPU 时间值。但互斥时间会因为这些事件而远远小于相容时间。

  2. 单击 [调用者-被调用者] 标签。

    选定的函数 recurse() 显示在中央窗格中。由 recurse() 调用的函数 real_recurse() 显示在下部窗格中。此窗格称为 [被调用者] 窗格。

  3. 单击 real_recurse()

    此时 [调用者-被调用者] 标签便会显示 real_recurse() 的信息:

间接递归

  1. 在 [函数] 标签中,找到并选择函数 bounce()

    函数 bounce() 显示相容用户 CPU 时间,但其互斥用户 CPU 时间为零。这是因为 bounce() 的全部工作只是调用 bounce_a()

  2. 单击 [调用者-被调用者] 标签。

    [调用者-被调用者] 标签显示 bounce() 只调用一个函数 bounce_a()

  3. 单击 bounce_a()

    此时 [调用者-被调用者] 标签便会显示 bounce_a() 的信息:

  4. 单击 bounce_b()

    此时 [调用者-被调用者] 标签便会显示 bounce_b() 的信息。bounce_a() 出现在 [调用者] 窗格和 [被调用者] 窗格中。由于 bounce_b() 不是叶函数,并会累计它调用完成工作的 bounce_a() 实例的相容时间,因此将正确显示被调用者的归属时间。

另请参见
调用者-被调用者标签
互斥、相容和归属度量

找到要找的内容了吗?如未找到,请将您的意见通过电子邮件发送至 docfeedback@sun.com。
法律声明