KCachegrind 解释混乱
Posted
技术标签:
【中文标题】KCachegrind 解释混乱【英文标题】:KCachegrind interpretation confusion 【发布时间】:2010-11-08 18:03:32 【问题描述】:我正在尝试了解左侧面板中 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%
谢谢
【问题讨论】:
【参考方案1】:“self”表示该函数所花费的时间,而不是它调用的任何函数所花费的时间。如果“自我”较低且“包含”。很高,那么优化的最佳位置可能是其中一个孩子(例如,称为函数)。在这种情况下,mysql-query 似乎花费了大部分时间,因此您可能希望优化查询(如果可能)。 mysql_qeury
之所以有“self”==“incl.”是分析器无法查看函数,因为它在 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.”对列表进行排序时,您看到的是聚合起来很慢的函数。换句话说,那些在这里得分高的,不一定是慢的,但他们调用了其他的函数。如果一个函数在“包含”上得分很高。 并且有很多调用,你应该考虑尝试减少对这个函数的调用次数,或者让函数缓存它的结果(只有当它是一个查询而不是一个动作时才有效)。
当您按“自我”排序时,您会看到占用最多时间的实际调用。这些是您想要微调的功能。在大多数 PHP 脚本中,您会发现 mysql_query
支配着这个领域。如果您有很多电话,请再次尝试减少它们或缓存。如果您的电话很少,那么您可能需要优化 sql 查询。 PHP 调试器无法帮助您解决这个问题。相反,找到实际查询并在 mysql-console 中对其运行 explain
。这本身就是一整章。
【讨论】:
我可以试试。但是Incl.呢?关闭时是 80,然后是 mysql 查询中的 70,这与应该为 100% 的总百分比有何关系 你的意思是在 fn1() 中调用 fn1() 吗?这将导致无限循环 @Antonio:你是对的——那是一个错字。我现在已经更正了。 谢谢,确实很有帮助 这是否意味着列表按时间顺序排序,最近的在前?【参考方案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!
【讨论】:
以上是关于KCachegrind 解释混乱的主要内容,如果未能解决你的问题,请参考以下文章