Sun Studio 12:性能分析器

解释归属度量:示例

图 2–1 中说明了独占、包含和归属度量,该图包含完整的调用树。其中的焦点是中心函数,即函数 C。

图的后面显示了该程序的伪代码。

图 2–1 说明独占、包含和归属度量的调用树

说明独占、包含和归属度量的调用树。

Main 函数调用了函数 A 和函数 B,并将其 10 个单位的包含度量归属到函数 A,将 20 个单位的包含度量归属到函数 B。这些是函数 Main 的被调用者归属度量。它们的总和 (10+20) 加上函数 Main 的独占度量等于函数 main 的包含度量 (32)。

由于函数 A 将其所有时间都花费在对函数 C 的调用上,因此它的独占度量为 0 个单位。

函数 C 由以下两个函数调用:函数 A 和函数 B,并将其 10 个单位的包含度量归属到函数 A,将 15 个单位的包含度量归属到函数 B。这些是调用者归属度量。它们的总和 (10+15) 等于函数 C 的包含度量 (25)。

调用者归属度量等于函数 A 及 B 的包含度量和独占度量之间的差额,这意味着这两个函数只调用函数 C。(实际上,这两个函数可能会调用其他函数,但时间太短,在实验中不显示。)

函数 C 调用了两个函数,函数 E 和函数 F,并分别将其 10 个单位的包含度量归属到函数 E 和函数 F。这些是被调用者归属度量。它们的总和 (10+10) 加上函数 C 的独占度量 (5) 等于函数 C 的包含度量 (25)。

函数 E 及函数 F 的被调用者归属度量和被调用者包含度量是相同的。这意味着函数 E 及函数 F 仅由 C 调用。函数 E 的独占度量和包含度量是相同的,但函数 F 的这两种度量不同。这是因为函数 F 调用了其他函数(函数 G),但函数 E 没有调用。

下面显示了该程序的伪代码。

    main() {
       A();
       /Do 2 units of work;/
       B();
    }

    A() {
       C(10);
    }

    B() {
       C(7.5);
       /Do 5 units of work;/
       C(7.5);
    }

    C(arg) {
          /Do a total of "arg" units of work, with 20% done in C itself,
          40% done by calling E, and 40% done by calling F./
    }