Oracle Solaris Studio 12.2:性能分析器

递归如何影响函数级度量

递归函数直接或间接的调用使得度量的计算复杂化。性能分析器将函数的度量作为一个整体显示,而不是显示函数的每个调用的度量:因此,必须将一系列递归调用的度量压缩为单一度量。这不会影响通过调用堆栈底部的函数(叶函数)计算得出的独占度量,但会影响非独占度量和归属度量。

非独占度量是通过将事件的度量添加到调用堆栈中函数的非独占度量来计算的。为了确保在递归调用堆栈中不重复计算度量,事件的度量仅能向每个唯一函数的非独占度量添加一次。

归属度量是通过非独占度量来计算的。在最简单的递归中,递归函数具有两个调用方:它本身和另一个函数(初始化函数)。如果在最后的调用中完成了所有工作,会将递归函数的非独占度量归属到它本身,而不是初始化函数。之所以发生此归属,是因为递归函数的所有更高调用的非独占度量均被视为零,以避免重复计算度量。但是,初始化函数会由于递归调用而作为被调用方正确归属到递归函数的非独占度量部分。