我已经开始了我的第一个比较严肃的 PHP 编程项目,并且很难获得良好的分析信息。我使用 xdebug 和 cachegrind 来分析代码,但它假定函数的“ self ”执行时间是函数执行所需的总时间减去它调用的任何函数的总时间。
虽然这在本质上是正确的,但在我尝试优化代码时,它并没有提供多少帮助。例如,我有一个包含两个 if 语句的简单函数,它返回一个包含两个值的数组,根据 xdebug,它占用了总执行时间的 26%。它使用 array_key_exists,我可以看到这些函数调用的执行时间约为 1%。我看不到的是其余 25% 的执行时间是如何与其余代码一起计算的。 if 语句、获取值对、将这些值放入数组并返回数组需要多长时间?
我在文档中遗漏了一些 xdebug 标记吗?或者是否有用于 PHP 的分析工具可以分析变量赋值、运算符、基本数据类型的构造和其他非功能性调用?最好是不假定脚本可通过网络服务器使用的东西。
与我正在寻找的内容类似的示例是 nytprof对于 perl。请注意,它分析了函数中的每一行代码(除了最后一次推送,它永远不会被执行)。
最佳答案
如果您想测量每行统计信息,我建议您结合使用 declare (对勾),register_tick_function
, microtime()
和 debug_backtrace
.这使您可以在每一行执行后调用任意函数,而无需更改 PHP 源代码。
例如:
declare(ticks=1);
register_tick_function( function() {
print "call\n";
} );
print "hi\n";
print "bye\n";
实际是这样运行的:
declare(ticks=1);
register_tick_function( function() {
//print "call\n";
} ); print "call\n";
print "hi\n"; print "call\n";
print "bye\n"; print "call\n";
不幸的是,如果你走这条路,你就得靠自己了。您必须自己记录数据,进行分析,然后找出将其与来源相关联的方法。这并非不可能,但据我所知,这些工具尚不存在用于 PHP。
概念验证:
function _line_benchmark( $reset = FALSE ) {
$start_time = microtime(TRUE);
static $lastFrame = NULL;
if( $reset ) {
$lastFrame = NULL;
return;
}
$backtrace = debug_backtrace();
$last_backtrace = $backtrace[count($backtrace) -1];
$file = $last_backtrace["file"];
$line = $last_backtrace["line"];
$source = file_get_contents( $file );
$source_lines = preg_split( "/((\r(?!\n))|((?<!\r)\n)|(\r\n))/", $source );
if( ! is_null( $lastFrame ) ) {
if( $lastFrame["line"]+1 <= $line ) {
print "{\n";
for( $i = $lastFrame["line"]+1; $i <= $line; $i++ ) {
print "#".($i-1)."\t".$source_lines[$i-1]."\n";
}
print "} - ".($start_time-$lastFrame["time"])."\n\n";
}
}
$lastFrame = array(
"time" => microtime(TRUE),
"file" => $file,
"line" => $line
);
}
function line_benchmark_start() {
_line_benchmark( TRUE ); //reset benchmark functions
declare(ticks=1);
register_tick_function( "_line_benchmark" );
}
function line_benchmark_stop() {
unregister_tick_function( "_line_benchmark" );
}
line_benchmark_start();
usleep( 100 );
usleep( 1000 );
usleep( 10000 );
usleep( 100000 );
usleep( 1000000 );
line_benchmark_stop();
输出
{
#48
#49 usleep( 100 );
} - 0.000154972076416
{
#50 usleep( 1000 );
} - 0.00112199783325
{
#51 usleep( 10000 );
} - 0.0101318359375
{
#52 usleep( 100000 );
} - 0.0998418331146
{
#53 usleep( 1000000 );
} - 0.999831914902
关于php - 在 PHP 中分析不仅仅是函数调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5443525/