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 忽略或单独跟踪探查器调用所花费的额外时间?
归档时间: |
|
查看次数: |
870 次 |
最近记录: |