我使用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 忽略或单独跟踪为探查器调用花费的额外时间?
答案 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作为分析器,我建议没有人应该使用它。