Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/226.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何衡量用PHP编写的代码的速度?_Php_Testing_Performance_Measurement - Fatal编程技术网

如何衡量用PHP编写的代码的速度?

如何衡量用PHP编写的代码的速度?,php,testing,performance,measurement,Php,Testing,Performance,Measurement,我怎样才能说哪个类的执行速度更快?是否有一个软件来衡量这一点?如果它是可以在Web环境之外测试的东西,我只使用Unixtime命令。如果它是可以在Web环境之外测试的东西,我只使用Unixtime命令。对于快速的东西,我这样做(在PHP中): 您也可以使用像。这样的探查器来快速完成我的工作(在PHP中): 您还可以使用分析器,如。您可以使用基本功能,如在操作前后存储时间戳或microtime()来计算所需的时间。这很容易做到,但不是很准确。也许更好的解决方案是,我从未使用过它,但它似乎是我能找到

我怎样才能说哪个类的执行速度更快?是否有一个软件来衡量这一点?

如果它是可以在Web环境之外测试的东西,我只使用Unix
time
命令。

如果它是可以在Web环境之外测试的东西,我只使用Unix
time
命令。

对于快速的东西,我这样做(在PHP中):

您也可以使用像。

这样的探查器来快速完成我的工作(在PHP中):


您还可以使用分析器,如。

您可以使用基本功能,如在操作前后存储时间戳或microtime()来计算所需的时间。这很容易做到,但不是很准确。也许更好的解决方案是,我从未使用过它,但它似乎是我能找到的最著名的PHP调试器/分析器。

您可以使用一些基本的东西,比如在操作前后存储时间戳或microtime()来计算所需的时间。这很容易做到,但不是很准确。也许更好的解决方案是,我从未使用过它,但它似乎是我能找到的最著名的PHP调试器/分析器。

Zend Studio内置了对使用XDebug或ZendeBugger进行评测的支持。它将分析您的代码,准确地告诉您每个函数需要多长时间。它是查明瓶颈所在的绝佳工具。

Zend Studio内置了对使用XDebug或ZendeBuger进行评测的支持。它将分析您的代码,准确地告诉您每个函数需要多长时间。这是一个很好的工具,可以找出瓶颈所在。

您(至少)有两种解决方案:

相当“幼稚”的一种方法是使用微时间(true)在代码的一部分之前和之后,来获取执行过程中经过了多少时间;其他的答案都是这样的,并且已经给出了一些例子,所以我就不多说了

如果您想对两条指令进行基准测试,这是一个很好的解决方案;例如,比较两种类型的函数——最好执行数千次,以确保对任何“扰动元素”进行平均

类似于这样,如果您想知道序列化数组需要多长时间:

$before = microtime(true);

for ($i=0 ; $i<100000 ; $i++) {
    serialize($list);
}

$after = microtime(true);
echo ($after-$before)/$i . " sec/serialize\n";
(有关更多信息,请阅读文档)

此屏幕截图来自KcacheGrind的C++程序:
(来源:)

使用PHP脚本,您将得到完全相同的结果;-)
(我的意思是,使用KCacheGrind;WinCacheGrind不如KCacheGrind好…)

这使您能够很好地了解应用程序中需要花费的时间——有时,它确实有助于找到使一切变慢的函数^^

请注意,Xdebug统计PHP花费的CPU时间;当PHP等待数据库的应答时(例如),它不工作;只是等待。因此Xdebug会认为DB请求不会花费太多时间!
这应该在SQL server上进行分析,而不是在PHP上,所以


希望这有帮助:-)
玩得开心!

您(至少)有两种解决方案:

相当“幼稚”的一种方法是使用microtime(true)在一部分代码之前和之后,来获取在执行过程中经过了多少时间;其他答案说了这一点,并且已经给出了示例,所以我不会说太多

如果您想对一些指令进行基准测试,这是一个很好的解决方案;比如,比较两种类型的函数——最好是进行数千次,以确保任何“扰动元素”都是平均值

类似于这样,如果您想知道序列化数组需要多长时间:

$before = microtime(true);

for ($i=0 ; $i<100000 ; $i++) {
    serialize($list);
}

$after = microtime(true);
echo ($after-$before)/$i . " sec/serialize\n";
(有关更多信息,请阅读文档)

此屏幕截图来自KcacheGrind的C++程序:
(来源:)

使用PHP脚本,您将得到完全相同的结果;-)
(我的意思是,使用KCacheGrind;WinCacheGrind不如KCacheGrind好…)

这使您能够很好地了解应用程序中需要花费的时间——有时,它确实有助于找到使一切变慢的函数^^

注意,Xdebug统计PHP花费的CPU时间;例如,当PHP等待来自数据库的答案时,它不工作;只是等待。所以Xdebug会认为DB请求不会花费太多时间!
这应该在SQL server上进行分析,而不是在PHP上,所以


希望这有帮助:-)

玩得开心

我最近一直在使用XHProf。它最初是由Facebook开发的,它有一个不错的网络界面。

我最近一直在使用XHProf。它最初是由Facebook开发的,它有一个不错的web界面。

我想与大家分享一个自制的函数,我用来测量任何现有函数的速度,最多10个参数:

function fdump($f_name='', $f_args=array()){

    $f_dump=array();
    $f_result='';

    $f_success=false;

    $f_start=microtime();
    $f_start=explode(' ', $f_start);
    $f_start=$f_start[1] + $f_start[0];

    if(function_exists($f_name)){

        if(isset($f_args[0])&&is_array($f_args[0])){
            if($f_result=$f_name($f_args)){
                $f_success=true;
            }
        }
        elseif(!isset($f_args[1])){
            if($f_result=$f_name($f_args[0])){
                $f_success=true;
            }
        }
        elseif(!isset($f_args[2])){
            if($f_result=$f_name($f_args[0],$f_args[1])){
                $f_success=true;
            }
        }
        elseif(!isset($f_args[3])){
            if($f_result=$f_name($f_args[0],$f_args[1],$f_args[2])){
                $f_success=true;
            }
        }
        elseif(!isset($f_args[4])){
            if($f_result=$f_name($f_args[0],$f_args[1],$f_args[2],$f_args[3])){
                $f_success=true;
            }
        }
        elseif(!isset($f_args[5])){
            if($f_result=$f_name($f_args[0],$f_args[1],$f_args[2],$f_args[3],$f_args[4])){
                $f_success=true;
            }
        }
        elseif(!isset($f_args[6])){
            if($f_result=$f_name($f_args[0],$f_args[1],$f_args[2],$f_args[3],$f_args[4],$f_args[5])){
                $f_success=true;
            }
        }
        elseif(!isset($f_args[7])){
            if($f_result=$f_name($f_args[0],$f_args[1],$f_args[2],$f_args[3],$f_args[4],$f_args[5],$f_args[6])){
                $f_success=true;
            }
        }
        elseif(!isset($f_args[8])){
            if($f_result=$f_name($f_args[0],$f_args[1],$f_args[2],$f_args[3],$f_args[4],$f_args[5],$f_args[6],$f_args[7])){
                $f_success=true;
            }
        }
        elseif(!isset($f_args[9])){
            if($f_result=$f_name($f_args[0],$f_args[1],$f_args[2],$f_args[3],$f_args[4],$f_args[5],$f_args[6],$f_args[7],$f_args[8])){
                $f_success=true;
            }
        }
        elseif(!isset($f_args[10])){
            if($f_result=$f_name($f_args[0],$f_args[1],$f_args[2],$f_args[3],$f_args[4],$f_args[5],$f_args[6],$f_args[7],$f_args[8],$f_args[9])){
                $f_success=true;
            }
        }
    }
    $f_end=microtime();
    $f_end=explode(' ', $f_end);
    $f_end=$f_end[1] + $f_end[0];

    $f_time=round(($f_end - $f_start), 4);
    $f_dump['f_success']=$f_success;
    $f_dump['f_time']=$f_time;
    $f_dump['f_result']=$f_result;

    var_dump($f_dump);exit;

    //return $f_result;

}
示例

function do_stuff($arg1='', $arg2=''){
    return $arg1.' '.$arg2;
}

fdump('do_stuff',array('hello', 'world'));
返回

  array(3) {
    ["f_success"]=>
    bool(true)
    ["f_time"]=>
    float(0)            //too fast...
    ["f_result"]=>
    string(11) "hello world"
  }

我想与大家分享一个自制的函数,我用它来测量任何现有函数的速度,最多10个参数:

function fdump($f_name='', $f_args=array()){

    $f_dump=array();
    $f_result='';

    $f_success=false;

    $f_start=microtime();
    $f_start=explode(' ', $f_start);
    $f_start=$f_start[1] + $f_start[0];

    if(function_exists($f_name)){

        if(isset($f_args[0])&&is_array($f_args[0])){
            if($f_result=$f_name($f_args)){
                $f_success=true;
            }
        }
        elseif(!isset($f_args[1])){
            if($f_result=$f_name($f_args[0])){
                $f_success=true;
            }
        }
        elseif(!isset($f_args[2])){
            if($f_result=$f_name($f_args[0],$f_args[1])){
                $f_success=true;
            }
        }
        elseif(!isset($f_args[3])){
            if($f_result=$f_name($f_args[0],$f_args[1],$f_args[2])){
                $f_success=true;
            }
        }
        elseif(!isset($f_args[4])){
            if($f_result=$f_name($f_args[0],$f_args[1],$f_args[2],$f_args[3])){
                $f_success=true;
            }
        }
        elseif(!isset($f_args[5])){
            if($f_result=$f_name($f_args[0],$f_args[1],$f_args[2],$f_args[3],$f_args[4])){
                $f_success=true;
            }
        }
        elseif(!isset($f_args[6])){
            if($f_result=$f_name($f_args[0],$f_args[1],$f_args[2],$f_args[3],$f_args[4],$f_args[5])){
                $f_success=true;
            }
        }
        elseif(!isset($f_args[7])){
            if($f_result=$f_name($f_args[0],$f_args[1],$f_args[2],$f_args[3],$f_args[4],$f_args[5],$f_args[6])){
                $f_success=true;
            }
        }
        elseif(!isset($f_args[8])){
            if($f_result=$f_name($f_args[0],$f_args[1],$f_args[2],$f_args[3],$f_args[4],$f_args[5],$f_args[6],$f_args[7])){
                $f_success=true;
            }
        }
        elseif(!isset($f_args[9])){
            if($f_result=$f_name($f_args[0],$f_args[1],$f_args[2],$f_args[3],$f_args[4],$f_args[5],$f_args[6],$f_args[7],$f_args[8])){
                $f_success=true;
            }
        }
        elseif(!isset($f_args[10])){
            if($f_result=$f_name($f_args[0],$f_args[1],$f_args[2],$f_args[3],$f_args[4],$f_args[5],$f_args[6],$f_args[7],$f_args[8],$f_args[9])){
                $f_success=true;
            }
        }
    }
    $f_end=microtime();
    $f_end=explode(' ', $f_end);
    $f_end=$f_end[1] + $f_end[0];

    $f_time=round(($f_end - $f_start), 4);
    $f_dump['f_success']=$f_success;
    $f_dump['f_time']=$f_time;
    $f_dump['f_result']=$f_result;

    var_dump($f_dump);exit;

    //return $f_result;

}
示例

function do_stuff($arg1='', $arg2=''){
    return $arg1.' '.$arg2;
}

fdump('do_stuff',array('hello', 'world'));
返回

  array(3) {
    ["f_success"]=>
    bool(true)
    ["f_time"]=>
    float(0)            //too fast...
    ["f_result"]=>
    string(11) "hello world"
  }

我做了一个简单的计时课程,也许对某人有用:

class TimingHelper {

    private $start;

    public function __construct() {
        $this->start = microtime(true);
    }

    public function start() {
        $this->start = microtime(true);
    }

    public function segs() {
        return microtime(true) - $this->start;
    }

    public function time() {
        $segs = $this->segs();
        $days = floor($segs / 86400);
        $segs -= $days * 86400;
        $hours = floor($segs / 3600);
        $segs -= $hours * 3600;
        $mins = floor($segs / 60);
        $segs -= $mins * 60;
        $microsegs = ($segs - floor($segs)) * 1000;
        $segs = floor($segs);

        return 
            (empty($days) ? "" : $days . "d ") . 
            (empty($hours) ? "" : $hours . "h ") . 
            (empty($mins) ? "" : $mins . "m ") . 
            $segs . "s " .
            $microsegs . "ms";
    }

}
使用:

$th=新计时助手();
echo$th->time();
$th->start();//如果是这样的话
echo$th->time();
//结果:4d 17h 34m 57s 0.00095367431640625ms

我制作了一个简单的计时类,可能对某些人有用:

class TimingHelper {

    private $start;

    public function __construct() {
        $this->start = microtime(true);
    }

    public function start() {
        $this->start = microtime(true);
    }

    public function segs() {
        return microtime(true) - $this->start;
    }

    public function time() {
        $segs = $this->segs();
        $days = floor($segs / 86400);
        $segs -= $days * 86400;
        $hours = floor($segs / 3600);
        $segs -= $hours * 3600;
        $mins = floor($segs / 60);
        $segs -= $mins * 60;
        $microsegs = ($segs - floor($segs)) * 1000;
        $segs = floor($segs);

        return 
            (empty($days) ? "" : $days . "d ") . 
            (empty($hours) ? "" : $hours . "h ") . 
            (empty($mins) ? "" : $mins . "m ") . 
            $segs . "s " .
            $microsegs . "ms";
    }

}
使用:

$th=新计时助手();
echo$th->time();
$th->start();//如果是这样的话
echo$th->time();
//结果:4d 17h 34m 57s 0.00095367431640625ms

如果您想快速测试框架的性能,可以在index.php文件中输入

//at beginning
$milliseconds = round(microtime(true) * 1000);

//and at the end
echo round(microtime(true) * 1000) - $milliseconds;

每次您都将获得以毫秒为单位的执行时间。因为微秒在测试框架案例时并不太有用。

如果您想快速测试框架的性能,您可以在index.php文件中输入

//at beginning
$milliseconds = round(microtime(true) * 1000);

//and at the end
echo round(microtime(true) * 1000) - $milliseconds;
每次您都将获得以毫秒为单位的执行时间。因为微秒在测试框架案例时不太有用。