KCachegrind解释混乱

2022-08-30 12:26:15

我正在尝试理解左侧面板中Kcachegrind中显示的值

我有Incl.(我在手册中读到的是包容性的),Self,称为函数

现在我正在分析这个缓存颗粒文件,我有

Incl. ---- Self ---- Called ---- Function

100.05 ---- 0.04 ---- (0) ---- {main}

83.38 ---- 0.07 ---- 250 --- item->close

78.85 ---- 78.85 ---- 10 067 ---- php::mysql_query

列表继续。

但这是我的问题。

我认为>关闭是我的瓶颈,但我不明白的是它如何具有83.38的包容性,然后是0.07的Self,并且mysql_query命令在两者中具有相同的。

这里的“自我”意味着什么?

此外,这些百分比如何相互关联?我不明白为什么物品>关闭需要83%,mysql_query需要78%

谢谢


答案 1

“self”表示该函数所花费的时间,但不是它调用的任何函数所花费的时间。如果“self”很低,而“inc.”很高,那么优化的最佳位置可能是在其中一个子级(例如,称为函数)。在这种情况下,看起来mysql查询花费了大部分时间,因此您可能希望优化查询(如果可能)。之所以有“self” == “incl.”的原因是探查器无法看到函数,因为它在php运行时之外(例如在mysql客户端库中)进行工作。mysql_qeury

我可能会补充说,10067个电话看起来非常可疑。数据库查询是一项非常昂贵的操作。您确定无法以某种方式减少查询数量吗?mysql_query

编辑:

我可以试试。但是Inc.呢?在收盘时为80,然后在mysql查询中为70,这与应为100%的总百分比有何关系

这些数字不需要相加。你正在看的是一个排序列表,列出这些函数所采用的整体时间。它不是一个调用图(尽管它经常会以某种方式模仿它)。

假定以下代码:

function fn1() {
  sleep(1);
  fn2();
}
function fn2() {
  sleep(98);
}
function fn3() {
  sleep(1);
}
fn1();
fn3();

这可能会生成以下输出:

name | incl. | self
main | 100%  | 0%
fn1  | 99%   | 1%
fn2  | 98%   | 98%
fn3  | 1%    | 1%

当您按“incl.”对列表进行排序时,您正在查看聚合速度较慢函数。换句话说,那些在这里得分高的函数不一定很慢,但它们调用其他函数。如果某个函数在“incl”上得分很高。并且有许多调用,您应该考虑尝试减少对此函数的调用次数,或者让函数缓存其结果(仅当它是查询而不是操作时才有效)。

当您按“自我”排序时,您将看到占用最多时间的实际呼叫。这些是您要微调的功能。在大多数PHP脚本中,你会发现它主导了这个领域。如果您有许多呼叫,请再次尝试减少它们或缓存。如果您的调用很少,则可能需要优化 sql 查询。PHP调试器无法帮助您。相反,找到实际的查询并在mysql控制台中对其运行。这本身就是一整章。mysql_queryexplain


答案 2

Self 表示在函数中花费的时间,不包括它调用的任何函数。

例如:

function foo()
{
    bar();
}

function bar
{
    sleep(1);
}

foo();

这将为您提供:

Incl    Self   Func
1       0      foo
1       0      bar
1       1      sleep <- Here's the bottleneck!

推荐