对PHP页面加载时间进行基准测试

时间:2010-03-16 12:12:51

标签: php benchmarking

如何衡量加载页面所需的时间(使用各种不同的PHP语句)?

有点像这里的统计数据 - http://talks.php.net/show/drupal08/24

10 个答案:

答案 0 :(得分:43)

有很多方法可以做到这一点。我个人喜欢以下列方式使用microtime

// Start of code
$time = microtime(true); // Gets microseconds

// Rest of code

// End of code
echo "Time Elapsed: ".(microtime(true) - $time)."s";

这将为您提供微秒精度。

如果您正在编写命令行脚本(如Facebook谜题),您可以只使用时间。

time php dancebattle.php ~/input.dat
Win

real    0m0.152s
user    0m0.142s
sys     0m0.012s

我忘记了监控页面加载时间的方法(来自浏览器)。您可以使用Firebug(适用于Firefox)的NET选项卡来执行此操作。它可以让你观察各种文件加载(AJAX,JS,CSS,图像等)。

答案 1 :(得分:11)

最简单的是Apache Bench (称为ab,它随Apache一起提供:

  • 这是一个命令行工具
  • 可以并行发送许多请求和URL
  • 并报告时间,错误,......

似乎适合幻灯片上显示的那种非常简单的报告。
(实际报告的内容不止于此)


如果您的需求更复杂,Siege可能是一个不错的选择。

Siege的一个有趣的事情是,它可以从文件中获取一个URL列表,而不是只使用一个。


这些工具的一个有趣之处在于,您不仅仅测量执行特定部分代码所花费的时间(就像在PHP代码中直接使用microtime那样),但是'获得服务页面所需的整个时间。

此外,它不仅可以对PHP代码进行基准测试,因为它正在处理HTTP请求,而不是代码本身。

答案 2 :(得分:9)

  $ time curl http://www.example.com/

请注意,它会占用整个请求,包括网络延迟。但那可能是你想要的?

答案 3 :(得分:4)

尝试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
)

答案 4 :(得分:2)

您可以在处理开始时和输出结束时使用microtime(),然后根据需要计算差异并将其转换为秒。

这只会测量PHP端的执行时间,而不是整个页面加载时间似乎在你的链接中,但它可以比较各种方法的性能,例如。

答案 5 :(得分:2)

您说要测量“页面加载时间”完全不同于

  1. 生成页面所需的时间(由PHP代码中的内部计时器测量)

  2. 并从服务器卸载(由ab测量)

  3. 页面加载时间应该包括解析HTML并向服务器发送后续请求以获取所有相关内容(javascript文件,css文件,图像等)所花费的时间。

    测量这个实际上非常困难。要正确地执行此操作,您需要推送所有逻辑客户端 - 在用户单击链接或提交表单时删除带时间戳的javascript cookie,然后在后续页面中使用onload方法(在所有内容加载后触发)将此时间与当前时间进行比较。然后,您需要一种将此度量标准报告回服务器的方法 - 您可以使用Ajax请求,或将时间存储在另一个cookie中,以便在后续请求中显示。

    请注意,每个客户端所需的文件将取决于浏览器端缓存的当前状态。

    如果您可以从日志中隔离点击流,那么您可以通过检查text / html内容类型请求与text / html之外的内容类型的最后连续请求之间的间隔来获得良好的近似值。但是,如果用户同时与多个浏览器窗口进行交互,您的统计数据将会出现偏差。

答案 6 :(得分:1)

  1. 方法一:使用xdebug。
  2. 方法二: 将这些陈述放在你的脚本周围

    $TIMER['label']=microtime(1);
    /* some code */
    $TIMER['sql1_before']=microtime(1);
    a/* some code */
    $TIMER['sql1_after']=microtime(1);
    /* some code */

  3. 然后输出它,代码如下:

      echo "<table border=1><tr><td>name</td><td>so far</td><td>delta</td><td>per cent</td></tr>";
      reset($TIMER);
      $start=$prev=current($TIMER);
      $total=end($TIMER)-$start;
      foreach($TIMER as $name => $value) {
        $sofar=round($value-$start,3);
        $delta=round($value-$prev,3);
        $percent=round($delta/$total*100);
        echo "<tr><td>$name</td><td>$sofar</td><td>$delta</td><td>$percent</td></tr>";
        $prev=$value;
      }
        echo "</table>";
    

    因此,您将获得有关代码如何运行的四线报告。 此操作称为profiling,并在优化过程中占据最重要的位置。

答案 7 :(得分:0)

该演示文稿中的输出似乎是从Siege(http://www.joedog.org/index/siege-home)中复制的。

另一个非常有用的“真实世界”性能测试工具是Firebug(http://getfirebug.com/)和YSlow(http://developer.yahoo.com/yslow/

答案 8 :(得分:0)

使用microtime()PHP函数,您将确切知道执行PHP代码需要多长时间。按照以下步骤将PHP代码放在您的网页上:

将以下代码放在PHP页面的最顶层(如果您在PHP代码部分之前测量代码的特定部分所需的时间)

<?php
$time = microtime();
$time = explode(' ', $time);
$time = $time[1] + $time[0];
$start = $time;
?>

以下代码必须放在网页的最末端(或PHP代码部分的末尾)

<?php
$time = microtime();
$time = explode(' ', $time);
$time = $time[1] + $time[0];
$finish = $time;
$total_time = round(($finish - $start), 4);
echo 'Page generated in '.$total_time.' seconds.';

如果不起作用,请使用microtime(true)而不是microtime()

答案 9 :(得分:0)

将以下代码放在PHP页面的顶部。

<?php
$statrttime = microtime();
$time = explode(' ', $statrttime);
$time = $time[1] + $time[0];
$start = $time;
?>

以下代码必须放在页面的末尾。

<?php
$endtime = microtime();
$time = explode(' ', $endtime);
$time = $time[1] + $time[0];
$finish = $time;
$total_time = round(($finish - $start), 4);
echo 'Page load in '.$total_time.' seconds.';
?>

注意:如果您测量代码的特定部分的时间,请将此正确的开始和最后的PHP代码部分。

相关问题