如何衡量用PHP编写的代码的速度?
我怎样才能说哪个类的执行速度更快?是否有一个软件来衡量这一点?如果它是可以在Web环境之外测试的东西,我只使用Unix如何衡量用PHP编写的代码的速度?,php,testing,performance,measurement,Php,Testing,Performance,Measurement,我怎样才能说哪个类的执行速度更快?是否有一个软件来衡量这一点?如果它是可以在Web环境之外测试的东西,我只使用Unixtime命令。如果它是可以在Web环境之外测试的东西,我只使用Unixtime命令。对于快速的东西,我这样做(在PHP中): 您也可以使用像。这样的探查器来快速完成我的工作(在PHP中): 您还可以使用分析器,如。您可以使用基本功能,如在操作前后存储时间戳或microtime()来计算所需的时间。这很容易做到,但不是很准确。也许更好的解决方案是,我从未使用过它,但它似乎是我能找到
time
命令。如果它是可以在Web环境之外测试的东西,我只使用Unixtime
命令。对于快速的东西,我这样做(在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好…)
这应该在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好…)
这应该在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;
每次您都将获得以毫秒为单位的执行时间。因为微秒在测试框架案例时不太有用。