KCachegrind解释混乱

时间:2009-07-07 15:47:45

标签: php kcachegrind

我试图理解左侧面板中Kcachegrind中显示的值

我有。 (我在手册中读到的内容包括),Self,称为函数

现在我正在分析这个cachegrind文件,我有

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

并且列表继续..

但这是我的问题。

我认为item-> close是我的瓶颈,但我不明白它是如何包含83.38的Inclusive,然后是0.07的Self和mysql_query命令在两者中都是相同的。

'self'在这里表示什么?

这些百分比如何相互关联?我不知道item-> close如何占用83%而mysql_query占78%

由于

2 个答案:

答案 0 :(得分:58)

“self”表示该函数所用的时间,但不是来自它调用的任何函数。如果“自我”很低并且“包含”很高,那么优化的最佳位置可能是其中一个孩子(例如称为函数)。在这种情况下,看起来mysql查询占用大部分时间,因此您可能希望优化查询(如果可能)。 mysql_qeury有“自我”==“包含”的原因是分析器无法看到函数,因为它在php-runtime之外工作(例如在mysql客户端库中)

我可能会补充说,对mysql_query的10067次调用确实看起来很可疑。数据库查询是一项非常昂贵的操作。你确定你不能以某种方式减少查询数量吗?

编辑:

  

我可以试试。但是Incl。呢?如何在关闭时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”上得分很高有很多调用,你应该考虑减少对这个函数的调用次数,或者让函数缓存它的结果(只有当它是一个查询而不是一个动作时才有效)。 / p>

当您按“自我”排序时,您将看到占用大部分时间的实际通话。这些是您想要微调的功能。在大多数PHP脚本中,您会发现mysql_query在此字段中占主导地位。如果您有很多呼叫,请再次尝试减少它们或缓存。如果你几乎没有调用,那么你可能需要优化sql-query。 PHP调试器无法帮助您解决此问题。相反,找到实际的查询并在mysql-console中运行explain。这本身就是一整章。

答案 1 :(得分:13)

自我意味着在函数中花费的时间,不包括它调用的任何函数。

例如:

function foo()
{
    bar();
}

function bar
{
    sleep(1);
}

foo();

这会给你:

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