php - 在 PHP 中分析不仅仅是函数调用

标签 php performance profiling

我已经开始了我的第一个比较严肃的 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/

相关文章:

java - ils。从远程服务器调用CURL后重定向不起作用

c++ - 如何用整数 "fmod()"函数替换 "mod()"

java - 分析核心 java 以检查每个计数器的方法统计数据和延迟

python - Django haystack whoosh 超慢

java - Java 分析中的线程与加载类

php - 是否有从 Phar 文件发布 PHP Web 应用程序的解决方案?

php - 比较来自 mysql 的 PHP 中的 2 个日期时间,以便在 android 中查看

PHP 增加特定的行值

c# - HashSet 或 Distinct 以读取对象 List<> 中属性的不同值

php - stream_get_contents 是否比 file_get_contents 级别更低且速度更快?