39

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

我有包括。(我在手册中读到的内容包括在内),Self,Called an Function

现在我正在分析这个缓存研磨文件,我有

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 命令在两者中都相同。

这里的“自我”是什么意思?

此外,这些百分比如何相互关联?我不明白 item->close 如何占用 83% 而 mysql_query 占用 78%

谢谢

4

2 回答 2

65

“self”是指该函数所花费的时间,而不是它调用的任何函数所花费的时间。如果“自我”较低且“包含”。很高,那么优化的最佳位置可能是其中一个孩子(例如,称为函数)。在这种情况下,mysql-query 似乎花费了大部分时间,因此您可能希望优化查询(如果可能)。之所以mysql_qeury有“self”==“incl.” 是探查器无法查看函数,因为它在 php-runtime 之外进行工作(例如,在 mysql 客户端库中)

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

编辑:

我可以试试。但是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%

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

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

于 2009-07-07T15:52:32.127 回答
15

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!
于 2009-07-07T15:53:42.590 回答