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

时间:2011-09-29 12:59:43

标签: php performance profiler xdebug

我使用XDebug作为PHP应用程序的分析器。我遇到了这样一种情况:XDebug严重改变了结果,使得它们无用。

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

function foo(){ $x = 1; }
function bar(){ foo(); }

测试A:

$t0 = microtime(true);
for ($i = 0; $i < 1000000; $i++) foo();
echo microtime(true) - $t0;

测试B:

$t0 = microtime(true);
for ($i = 0; $i < 1000000; $i++) bar();
echo microtime(true) - $t0;

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

          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

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

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

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

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

这会导致结果无法使用。任何更模块化的代码(包含更多函数调用,包装器,对象等)都会受到严重惩罚,尽管 更慢!

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

4 个答案:

答案 0 :(得分:1)

众所周知,xdebug表现得像那样,实际上没有消息。对不起,显然这对你来说是新闻,我不想说每个人都需要知道。

作为解释:xdebug从头到尾完成整个作业,按照宣布的方式转储/度量分析。这个来了有价格(怎么可能不行?)。

如果您需要在脚本中的隔离上下文中选择指标,则不应运行xdebug。或者正如您的问题所示:您正在尝试使用xdebug打开xdebug(使用PHP代码!)。这不会真正起作用,你不能用PHP用户代码分析PHP编译的C扩展,或者至少我不会相信那么多。想象一下,lib正在改变解释器的行为,同样的解释器正在运行分析代码。

如果您确实需要分析代码的特定部分,xdebug就不是首选工具。寻找xhprof或者在现实环境中Pinba

答案 1 :(得分:1)

你不应该期望分析者的结果与正常的操作相同,它是不可能的(或者你必须减慢操作,而不是欲望)

但是de profiler中的时间仍然非常有用,例如你可以看到,施法时间越长,结果(某些观察者)与尺度一致

使用分析器可以指出问题点,但是结果不能与reallife相同的是mutch优化(至少使用xdbug)

答案 2 :(得分:1)

一定要试试xhprof。似乎不太容易出错。不要敲Xdebug

答案 3 :(得分:1)

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