我试图理解左侧面板中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
Run Code Online (Sandbox Code Playgroud)
并且列表继续..
但这是我的问题.
我认为项目 - >关闭是我的瓶颈,但我不明白的是它是如何包含83.38的包含,然后是0.07的Self和mysql_query命令在两者中都是相同的.
"自我"在这里意味着什么?
这些百分比如何相互关联?我不明白item-> close需要83%而mysql_query需要78%
谢谢
tro*_*skn 59
"self"表示该函数所花费的时间,但不是来自它调用的任何函数.如果"自我"很低并且"包含" 很高,那么优化的最佳位置可能是其中一个孩子(例如称为函数).在这种情况下,看起来mysql查询占用大部分时间,因此您可能希望优化查询(如果可能).之所以mysql_qeury有"自我"=="包含".是分析器无法看到函数,因为它在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();
Run Code Online (Sandbox Code Playgroud)
哪个可能会生成以下输出:
name | incl. | self
main | 100% | 0%
fn1 | 99% | 1%
fn2 | 98% | 98%
fn3 | 1% | 1%
Run Code Online (Sandbox Code Playgroud)
当您按"incl."对列表进行排序时,您正在查看聚合缓慢的函数.换句话说,那些在这里得分高的人,不一定很慢,但他们称之为其他功能.如果一个函数在"incl"上得分很高 并且有很多调用,你应该考虑尝试减少对这个函数的调用次数,或者让函数缓存它的结果(只有当它是一个查询而不是一个动作时才有效).
当您按"自我"排序时,您将看到占用大部分时间的实际呼叫.这些是您想要微调的功能.在大多数PHP脚本中,您会发现在mysql_query该字段中占主导地位.如果您有很多呼叫,请再次尝试减少它们或缓存.如果你几乎没有调用,那么你可能需要优化sql-query.PHP调试器无法帮助您解决此问题.相反,找到实际的查询并explain在mysql-console中运行它.这本身就是一整章.
Gre*_*reg 13
Self表示在函数中花费的时间,不包括它调用的任何函数.
例如:
function foo()
{
bar();
}
function bar
{
sleep(1);
}
foo();
Run Code Online (Sandbox Code Playgroud)
这会给你:
Incl Self Func
1 0 foo
1 0 bar
1 1 sleep <- Here's the bottleneck!
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
11042 次 |
| 最近记录: |