我如何测量用PHP编写的代码的速度?
我怎么能说很多(哪些都做同样的工作)执行更快? 有没有一个软件来衡量呢?
你有(至less)两个解决scheme:
相当“天真”的一个是在部分代码之前和之后使用microtime(true)来获取执行过程中经过了多less时间; 其他答案已经说了,并且已经给出了例子,所以我没有多说。
如果你想基准几条指令,这是一个很好的解决scheme; 比如比较两种types的函数,例如 – 如果做了上千次,要确保任何“扰动元素”是平均的,那就更好了。
就像这样,如果你想知道序列化一个数组需要多长时间:
$before = microtime(true); for ($i=0 ; $i<100000 ; $i++) { serialize($list); } $after = microtime(true); echo ($after-$before)/$i . " sec/serialize\n";
不完美,但有用,而且不需要太多时间来build立。
另一个解决scheme,如果你想确定哪个函数在整个脚本中占用大量时间,那么这个解决scheme就非常好用了:
- Xdebug扩展,为脚本生成分析数据
- 读取分析数据的软件,并为您提供可读的内容。 我知道其中三个:
- Webgrind ; 网页界面 应该在任何Apache + PHP服务器上工作
- WinCacheGrind ; 只在窗户上
- KCacheGrind ; 大概只有Linux和linux一样; 顺便说一句,这是我喜欢的那个
要获得性能分析文件,您必须安装并configurationXdebug; 请查看文档的Profiling PHP Scripts页面。
我通常所做的不是默认启用profiler (它会生成相当大的文件,并减慢速度) ,但可以使用这种方式发送一个名为XDEBUG_PROFILE
的参数作为GET数据,以激活只需要页面的分析。
我的php.ini的分析相关部分看起来像这样:
xdebug.profiler_enable = 0 ; Profiling not activated by default xdebug.profiler_enable_trigger = 1 ; Profiling activated when requested by the GET parameter xdebug.profiler_output_dir = /tmp/ouput_directory xdebug.profiler_output_name = files_names
(阅读文档以获取更多信息)
这个截图来自KcacheGrind中的一个C ++程序: http ://kcachegrind.sourceforge.net/html/pics/KcgShot3Large.gif html/pics/KcgShot3Large.gif
你会得到完全一样的东西与PHP脚本;-)
(用KCacheGrind,我的意思是说,WinCacheGrind不如KCacheGrind …)
这可以让你对应用程序中需要花费时间的问题有一个很好的看法 – 有时它有助于find正在减慢速度的函数^^
请注意,Xdebug计算PHP花费的CPU时间; 当PHP正在等待数据库(例如)的答案时,它不工作; 只有等待。 所以Xdebug会认为DB请求不需要太多的时间!
这应该在SQL服务器,而不是PHP,所以…
希望这是有帮助的:-)
玩的开心 !
对于快速的东西,我这样做(在PHP中):
$startTime = microtime(true); doTask(); // whatever you want to time echo "Time: " . number_format(( microtime(true) - $startTime), 4) . " Seconds\n";
您也可以使用像http://xdebug.org/这样的分析器。;
我做了一个简单的授课,也许对某个人有用:
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 = new TimingHelper(); <..code being mesured..> echo $th->time(); $th->start(); // if it's the case <..code being mesured..> echo $th->time(); // result: 4d 17h 34m 57s 0.00095367431640625ms
我最近一直在使用XHProf http://pecl.php.net/package/xhprof 。 它最初是由Facebook开发的,它有一个体面的网页界面。
这里是直接回答你的问题
有没有一个软件来衡量呢?
就在这里。 我想知道为什么有人还没有提到它呢。 尽pipe上面提出的答案对于快速检查来说看起来不错,但是从长远来看或者对于一个更大的项目来说是不可扩展的。
为什么不使用应用程序性能监视(APM)工具,它正是为此而构build的。 检查NewRelic,AppDynamics,Ruxit(都有免费版本)来监控执行时间,资源使用情况,每个应用程序的吞吐量到方法级别。
我想和你分享一个我自己制作的函数,用来测量任何现有函数的速度,最多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" }
如果你想快速testing一个框架的性能,你可以放在index.php文件中
//at beginning $milliseconds = round(microtime(true) * 1000); //and at the end echo round(microtime(true) * 1000) - $milliseconds;
每次你会得到毫秒的执行时间。 因为在testing一个框架的情况下,微秒不是太有用。
如果它是可以在Web上下文之外进行testing的东西,我只需要使用Unix time
命令。
Zend Studio已经支持使用XDebug或ZendDebugger进行分析。 它会分析你的代码,告诉你每个函数花了多长时间。 这是一个很好的工具,找出你的瓶颈在哪里。
您可以在操作前后使用诸如存储时间戳或microtime()之类的基本内容来计算所需的时间。 这很容易做,但不是很准确。 也许更好的解决scheme是Xdebug ,我从来没有使用它,但它似乎是我能find的最知名的PHPdebugging器/分析器。