如何基准测试PHP脚本的效率

eri*_*ric 120 php performance benchmarking microtime

我想知道对PHP脚本进行基准测试的最佳方法是什么.无论是cron作业,还是网页或Web服务都无关紧要.

我知道我可以使用microtime但是它真的给了我PHP脚本的实时时间吗?

我想在PHP中测试和基准测试不同的函数,它们做同样的事情.例如,preg_matchvs strposdomdocumentvs 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;
Run Code Online (Sandbox Code Playgroud)

这将输出:0.0146126717(一直变化 - 但这是我得到的最后一个).这意味着执行PHP脚本需要0.015左右.

有没有更好的办法?

Jam*_*ler 119

如果您真的想要对真实世界的代码进行基准测试,请使用XdebugXHProf等工具.

Xdebug非常适合在开发/升级工作时使用,而XHProf是一个很好的生产工具,可以安全地在那里运行(只要你阅读说明).任何单个页面加载的结果都不会像看到你的代码如何执行那样相关,同时服务器也会受到重创,而且资源也会变得稀缺.这提出了另一个问题:你在CPU上遇到瓶颈吗?内存?I/O?

您还需要查看脚本中运行的代码,以及脚本/页面的提供方式.你使用什么Web服务器?举个例子,我可以认真地让nginx + PHP-FPM执行mod_php + Apache,这反过来又会因为使用一个好的CDN而无法提供静态内容.

接下来要考虑的是你要优化的是什么?

  • 页面在用户浏览器中呈现的速度是第一优先级吗?
  • 是否以最小的CPU消耗尽快将每个请求退回到服务器?

前者可以通过像抓取发送到浏览器的所有资源这样做来帮助,但这样做(在某些情况下)会使你远离实现后者.

希望上述所有内容都可以帮助表明精心隔离的"实验室"测试不会反映您在生产中遇到的变量和问题,并且您必须确定您的高级目标是什么,然后您可以做些什么来实现目标,在走向微观/过早优化路线到地狱之前.

  • 如果这真的回答了你的问题eric,我觉得你的问题措辞错误(或者我只是读错了).基于你的问题,听起来你想要在PHP中隔离不同的做同样事情的方法并确定哪一个是最快的.然而,基于您接受并给予赏金的答案,您似乎更感兴趣的是对整个Web堆栈进行负载测试 - 这是完全不同的. (5认同)

Boo*_*eus 71

要确定完整脚本在服务器上运行的速度,您可以使用大量工具.首先确保您的脚本(例如preg_match vs strpos)必须输出相同的结果才能使测试合格.

您可以使用:


Ale*_*rge 28

您将需要查看Xdebug,更具体地说,Xdebug的分析功能.

基本上,您启用了探查器,每次加载网页时,它都会创建一个可以使用WinCacheGrindKCacheGrind读取的cachegrind文件.

Xdebug配置有点棘手所以这里是我的相关部分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
Run Code Online (Sandbox Code Playgroud)

这是WinCacheGrind中.out文件的屏幕截图:

在此输入图像描述

这应该提供有关PHP脚本效率如何高效的详细信息.您希望定位花费最多时间的事物.例如,您可以优化一个函数以占用一半的时间,但是您可以更好地优化在页面加载期间称为数十(甚至数百次)的函数.

如果你很好奇,这只是我为自己编写的CMS的旧版本.

  • 因为我不使用Windows (13认同)
  • 看起来很复杂,我不懂事 (8认同)
  • +1 XDebug + KCacheGrind。它真的很有帮助,而且非常容易安装和使用。我已经使用它很长一段时间了,你会得到一个额外的好处 - 当你熟悉它时,你可以使用 KCacheGrind 和 Valgrind (+memgrind/callgrind) 来分析更多其他语言(不仅仅是 CPU 时间)。 (2认同)

fot*_*lab 16

试试https://github.com/fotuzlab/appgati

它允许在代码中定义步骤并在两个步骤之间报告时间,内存使用,服务器负载等.

就像是:

    $appgati->Step('1');

    // Do some code ...

    $appgati->Step('2');

    $report = $appgati->Report('1', '2');
    print_r($report);
Run Code Online (Sandbox Code Playgroud)

示例输出数组:

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
)
Run Code Online (Sandbox Code Playgroud)

  • 可爱的界面设计(如我所见,您是作者),谢谢!(并且感谢您使用“ ProperCase”;)方法名(例如SetMemory())而不是丑陋但仍然无处不在的mixedCase()废话,这在PHP中实际上是毫无意义的。你可能太老了 ;)) (2认同)

Til*_*ill 7

我会看看xhprof.它是在cli上运行还是通过另一个sapi(如fpm或fcgi甚至Apache模块)运行并不重要.

关于xhprof的最好的部分是它甚至足以适合在生产中运行.与xdebug不兼容的东西(我上次检查过).xdebug对性能有影响,xhprof(我不会说没有)管理得更好.

我们经常使用xhprof收集具有实际流量的样本,然后从那里分析代码.

它并不是一个真正的基准,它会让你有时间和所有这些,尽管它也是如此.它只是让分析生产流量变得非常容易,然后深入到收集的调用图中的php函数级别.

编译并加载扩展后,您可以在代码中开始分析:

xhprof_enable(XHPROF_FLAGS_CPU + XHPROF_FLAGS_MEMORY);
Run Code Online (Sandbox Code Playgroud)

停止:

$xhprof_data = xhprof_disable();
Run Code Online (Sandbox Code Playgroud)

然后将数据保存到文件或数据库 - 无论你的船只是什么漂浮,也不会中断通常的运行时间.我们异步将其推送到S3以集中数据(以便能够查看来自所有服务器的所有运行).

github上代码包含一个xhprof_html文件夹,您可以将其转储到服务器上,只需最少的配置,您就可以可视化收集的数据并开始向下钻取.

HTH!