如何基准PHP脚本的效率
我想知道什么是testing我的PHP脚本的最好方法。 如果是cron作业,网页或web服务,则无关紧要。
我知道我可以使用microtime,但它真的给了我一个PHP脚本的实时?
我想在PHP中testing和testing不同的function,做同样的事情。 例如, preg_match
vs strpos
或domdocument
vs preg_match
或preg_replace vs str_replace`
网页示例:
<?php // login.php $start_time = microtime(TRUE); session_start(); // do all my logic etc... $end_time = microtime(TRUE); echo $end_time - $start_time;
这将输出:0.0146126717(随时变化 – 但这是我得到的最后一个)。 这意味着执行PHP脚本需要0.015左右。
有没有更好的办法?
如果您真的想要testing真实世界的代码,请使用Xdebug和XHProf等工具。
Xdebug非常适合在开发/分期阶段工作,XHProf是一个很好的生产工具,只要你阅读说明就可以安全地运行它。 任何一个单页面加载的结果都不会像看到你的代码如何执行,而服务器也被迫做了一百万件其他事情,资源变得稀less。 这引出了另一个问题:你在CPU上瓶颈吗? 随机存取存储器? I / O?
您还需要将您脚本中正在运行的代码视为您的脚本/页面的服务方式。 你使用什么networking服务器? 举个例子,我可以使nginx + PHP-FPM严格执行mod_php + Apache,而这又会因为使用一个好的CDN而对静态内容提供服务。
接下来要考虑的是你正在试图优化的东西?
- 页面在用户浏览器中呈现的速度是否优先?
- 以最小的CPU消耗尽快把服务器的每个请求都抛出去的目标是什么?
前者可以通过对所有发送到浏览器的资源进行操作来帮助,但是这样做可能会(在某些情况下)推动你远离实现后者。
希望以上所有内容都能够帮助我们发现,仔细分离的“实验室”testing不会反映出您在生产过程中遇到的variables和问题,您必须确定您的高级目标是什么,然后才能做到这一点,然后在微观/过早优化路线上下地狱 。
要testing完整脚本在服务器上的运行速度,可以使用许多工具。 首先确保您的脚本(例如preg_match vs strpos)必须输出相同的结果才能validation您的testing。
您可以使用:
- JMeter的
- ApacheBench工具( 请参阅示例 )
- dbench
- http_load
- curl装载机
- 的httperf
- 围城
- 素食
- 你使用的代码也不错,但是有一个更大的循环(比如1,000,000)
您将需要查看Xdebug ,更具体地说, Xdebug的性能分析function 。
基本上,您启用了分析器,并且每次加载网页时,都会创build一个可以使用WinCacheGrind或KCacheGrind读取的cachegrind文件。
Xdebugconfiguration有点棘手,所以这里是我的php.ini
的相关部分供参考:
[XDebug] zend_extension = h:\xampp\php\ext\php_xdebug-2.1.1-5.3-vc6.dll xdebug.remote_enable=true xdebug.profiler_enable_trigger=1 xdebug.profiler_output_dir=h:\xampp\cachegrind xdebug.profiler_output_name=callgrind.%t_%R.out
这里是WinCacheGrind中 .out
文件的截图 :
这应该提供有关如何高效PHP脚本的充足的细节。 你要瞄准花费最多的时间。 例如,您可以优化一个函数以减less一半的时间,但是您的努力可以更好地优化在页面加载过程中被称为几十甚至几百次的函数。
如果你很好奇,这只是我为自己使用而写的一个CMS的旧版本。
试试https://github.com/fotuzlab/appgati
它允许定义代码中的步骤,并在两个步骤之间报告时间,内存使用情况,服务器负载等。
就像是:
$appgati->Step('1'); // Do some code ... $appgati->Step('2'); $report = $appgati->Report('1', '2'); print_r($report);
示例输出数组:
Array ( [Clock time in seconds] => 1.9502429962158 [Time taken in User Mode in seconds] => 0.632039 [Time taken in System Mode in seconds] => 0.024001 [Total time taken in Kernel in seconds] => 0.65604 [Memory limit in MB] => 128 [Memory usage in MB] => 18.237907409668 [Peak memory usage in MB] => 19.579357147217 [Average server load in last minute] => 0.47 [Maximum resident shared size in KB] => 44900 [Integral shared memory size] => 0 [Integral unshared data size] => 0 [Integral unshared stack size] => [Number of page reclaims] => 12102 [Number of page faults] => 6 [Number of block input operations] => 192 [Number of block output operations] => [Number of messages sent] => 0 [Number of messages received] => 0 [Number of signals received] => 0 [Number of voluntary context switches] => 606 [Number of involuntary context switches] => 99 )
我想看看xhprof 。 无论是在cli还是通过其他sapi(如fpm或fcgi甚至Apache模块)上运行,都没有关系。
关于xhprof的最好的部分是它甚至足够适合在生产中运行。 有些东西和xdebug不兼容(上次我检查过)。 xdebug对性能和xhprof(我不会说没有)有更好的pipe理。
我们经常使用xhprof来收集真实stream量的样本,然后从那里分析代码。
这不是一个真正的基准,它使你得到一个时间 ,所有这一切,但也是如此。 它只是使分析生产stream量变得非常容易,然后深入到收集的调用图中的php函数级别。
一旦扩展被编译和加载,你就可以开始在代码中分析:
xhprof_enable(XHPROF_FLAGS_CPU + XHPROF_FLAGS_MEMORY);
停止:
$xhprof_data = xhprof_disable();
然后将数据保存到一个文件或数据库 – 无论什么浮动,不会中断通常的运行时间。 我们asynchronous地把它推到S3集中数据(能够看到我们所有服务器的所有运行)。
github上的代码包含一个xhprof_html文件夹,您可以将其转储到服务器上,并且configuration最less,您可以可视化收集的数据并开始深入研究。
HTH!
把它放在一个for
循环中,做一百万次以获得一个更现实的数字。 只有在你真正想要进行基准testing的代码之前,才启动计时器,然后logging刚刚结束的时间(即在session_start()
之前不要启动计时器。
除了要计时的function之外,还要确保代码对于每个要进行基准testing的function都是相同的。
脚本是如何执行的(cronjob,php来自命令行,Apache等)不应该有所作为,因为您只是计算不同函数的速度之间的相对差异。 所以这个比例应该保持不变。
如果运行基准testing的计算机还有其他许多事情正在进行,那么在基准testing运行时,如果来自其他应用程序的CPU或内存使用量猛增,这可能会影响基准testing结果。 但是只要你有很多的资源可以留在电脑上,那么我不认为这会是一个问题。
一个好的开始是使用xdebugs profiler http://xdebug.org/docs/profiler
也许不是最容易设置和使用的东西,但一旦你开始使用,大量的数据和易于查看是不可替代的。
埃里克,
你问自己一个错误的问题。 如果你的脚本在〜15毫秒内执行,那么它的时间在很大程度上是不相关的。 如果您运行共享服务,则PHP映像激活将花费大约100毫秒,如果在服务器上完全caching,则可以在脚本文件中读取大约30-50毫秒,如果从后端NAS场中加载,则可能需要1秒或更多秒。 加载页面家具的networking延迟可能会增加很多秒。
这里的主要问题是用户对加载时间的看法:在点击链接和获得完全呈现的页面之间他或她必须等待多久。 看一下你可以用作Ff或Chrome扩展的Google Page Speed ,以及深入讨论如何获得良好的页面性能的Pagespeed文档。 遵循这些准则,并尝试让您的网页分数比90/100更好。 (谷歌主页得分99/100和我的博客一样)。 这是获得良好用户感知性能的最佳方式。
保持眼睛对着你的PHP代码也是很好的,并且仔细检查这个链接 ,以确保你的代码本身不会影响应用程序的性能。