Inclusive Time指函数自身执行时间及其所有子函数耗时总和,反映其在调用链中的整体责任;Self Time(Exclusive Time)仅统计函数体内部opcode执行时间,不含子调用,用于精准定位热点代码。

什么是 Inclusive Time 和 Self Time
在 Xdebug 生成的 cachegrind.out.* 文件里,Inclusive Time 和 Self Time 是两个核心耗时指标,它们反映的是同一函数在调用树中不同层次的时间归属。不理解这个区别,很容易误判“哪个函数最慢”。
为什么 Inclusive Time 高 ≠ 这个函数写得差
Inclusive Time 是该函数自身执行时间 + 所有它直接或间接调用的子函数总耗时。比如 get_user_data() 调用了 db_query() 和 format_user(),那它的 Inclusive Time 就包含这三者加起来的时间。
- 常见错误现象:看到
get_user_data()的Inclusive Time占比 95%,就去重写这个函数,结果毫无改善——因为真瓶颈在它调用的db_query() - 真正该关注的是:哪个函数的
Self Time高,且它没被其他函数大量调用(即不是“中转站”) - 典型高
Inclusive/ 低Self函数:__construct、dispatch()、run()这类入口或调度函数
Self Time 才是定位“热点代码”的关键
Self Time(也叫 Exclusive Time)只统计函数体内部执行的 opcode 时间,不含任何 call 指令的开销,也不含子函数耗时。它告诉你:“这段代码本身到底干了什么”。
Xdebug 3.4.1 是一款功能强大的 PHP 调试扩展工具,于 2025 年 1 月 6 日正式发布。作为 Xdebug 3.4 系列的首个修复版本,3.4.1 版在继承上一版本强大功能的同时,重点解决了稳定性问题。该版本不仅修复了访问超全局变量时可能引发的程序崩溃现象,还增强了对 Windows 平台 PIE 构建机制的支持,为广大 PHP 开发者提供了更加稳定的调试环境。这一版本适合所有
- 适合排查的场景:正则爆炸(
preg_replace)、大数组遍历(array_map)、未优化的字符串拼接(str_repeat)、重复序列化(json_encode) - 注意参数影响:
preg_replace('/.*/', '', $huge_string)的Self Time会远高于preg_replace('/\d+/', '', $small_string),但两者Inclusive Time可能接近(因正则引擎开销主导) - 性能陷阱:某些函数如
call_user_func_array自身Self Time很低,但它的Inclusive Time可能极高——说明它转发了大量耗时调用,这时要看它的调用者是谁,而不是优化它本身
看报告时必须交叉比对的三个值
单看一个时间数字容易误导。Webgrind 或 KCacheGrind 界面里,要同时盯住:
-
Self Time:判断函数本体是否低效 -
Inclusive Time:判断该函数在整个调用链中的“责任范围” -
Call Count:如果Self Time不高但Call Count极大(比如 10,000 次),哪怕单次只有 0.1ms,总耗时也达 1s——这是典型的“小操作累积成大延迟”
最容易被忽略的是第三点:高频低耗函数,在 Webgrind 的默认排序里常被压到表格底部,但它们加起来可能吃掉最多 CPU。


















