什么是"<循环1>"在Xdebug中的指示?

DTe*_*est 48 profiling xdebug kcachegrind

我在php脚本上有一个xdebug配置文件,我用kcachegrind解析.这是一个屏幕截图,显示在任何给定函数中花费的最多时间都花在内部<cycle 1>,而顶部' 调用者'是由index.php中的'include'和'include_once'构成的.

显示周期1的xdebug配置文件的kcachegrind

此配置文件在使用apache'ab'进行压力测试期间运行,因此发生了许多并发连接.

<cycle 1>在xdebug配置文件上显示什么?

osg*_*sgx 36

它是启发式循环检测.您可以从工具栏或菜单"查看 - >检测循环"或"查看 - >执行循环检测"将其关闭.

周期是一样的东西递归,直接(f() -> f() -> f()这里->指调用)和间接(f()->g()->f()->g()->f())

Callgring格式(在kcachegrind中使用)不保存完整的调用堆栈,它只存储调用者被调用者对,并且可能很难从此信息中恢复更长的周期


Cor*_*ein 26

虽然@osgx提到您可以关闭循环检测,但我只想在此指出,如果您觉得<cycle 1>隐藏了一些您感兴趣的内容,那么您可能应该关闭循环检测,正如他解释的那样.

在我的案例中禁用循环检测实际上揭示了之前丢失的一些关键信息.

  • @Octopus,有时会发生什么是"循环检测"合并(并模糊)一堆可能与爆发相关的细节; 所以在这种情况下,禁用循环检测并让这些细节通过是有帮助的.例如,在我的情况下,有几个__get方法重复相互调用,虽然使用完全有效,但它占用了大量的CPU.循环检测掩盖了重复的呼叫,IMO应该被认为是"循环检测/整合". (3认同)