XDebug可以单独跟踪探查器调用所花费的时间吗?

lin*_*ogl 11 php performance profiler xdebug

我使用XDebug作为PHP应用程序的分析器.我遇到了一个XDebug严重改变结果的情况,以至于它们没用.

这是一个演示问题的简化示例:

function foo(){ $x = 1; }
function bar(){ foo(); }
Run Code Online (Sandbox Code Playgroud)

测试A:

$t0 = microtime(true);
for ($i = 0; $i < 1000000; $i++) foo();
echo microtime(true) - $t0;
Run Code Online (Sandbox Code Playgroud)

测试B:

$t0 = microtime(true);
for ($i = 0; $i < 1000000; $i++) bar();
echo microtime(true) - $t0;
Run Code Online (Sandbox Code Playgroud)

所以,这些是我得到的结果(以秒为单位):

          profiler  | profiler  > profiler
          disabled  | enabled   > results
          --------------------------------------------------------------------
          output    | output    > total time   time in foo()   time in bar()
Test A    0.159     | 12.199    > 12.245       0.110           - (not called)
Test B    0.233     | 25.399    > 25.578       0.104           11.068
Run Code Online (Sandbox Code Playgroud)

由于对分析器的额外调用,预计会增加执行时间.基于微量滴定的输出和分析器结果之间的微小差异也是预期的.我已多次重复测试,结果总是相似的.

从禁用探查器的测试B的结果中,我们可以说脚本在foo()中花费大约0.159秒,在bar()中花费0.074秒.很明显,在bar()中花费的时间少于在foo()中花费的时间.

然而,当我分析探查(与qcachegrind)的结果,时间显示(),如酒吧花费(=11.068秒)是可笑比FOO()(=0.104秒)时更高.有一种可能的解释:每次进行函数调用时,探查器都会运行一些额外的代码来跟踪调用所花费的时间.我相信它从结果中排除了这个额外的时间,但显然它没有.

[编辑] 结果,探查器说bar()在这个程序中花费的时间比foo()多,而事实并非如我们在禁用探查器时所测量的那样.它甚至不是很接近!相对结果(每个函数所用时间的百分比)完全错误.这不应该是预料之中的,因为如果是这种情况,则探查器无法指示哪个函数占用大部分时间.虽然预计绝对时间会有(大)差异,但相对时间不应该有. [/编辑]

这会使结果无法使用.任何代码,更加模块化(有更多的函数调用,包装,对象等)严厉的惩罚,虽然不能慢!

所以问题是:有没有办法告诉XDebug 忽略单独跟踪探查器调用所花费的额外时间?

lin*_*ogl 2

不幸的是,这是不可能的。我不再使用 XDebug 作为分析器,并且我建议没有人应该使用它。