PHP5.4中while和for的性能对比

测试代码:

<?php

require 'Benchmark/Iterate.php';

$benchmark = new Benchmark_Iterate();


function fun_while() {
    $i = 0;
    while($i<=10000) {
        $i++;
    }
}

function fun_for() {
    for($i=0; $i<=10000;$i++) {}
}

$benchmark->run(50, 'fun_while');

print_r($result = $benchmark->get());

$benchmark->run(50, 'fun_for');

print_r($result = $benchmark->get());

结果:

while执行时间:0.00026299476623535

for执行时间:0.00044032096862793

PHP 5.4简单性能测试

测试PHP版本分别为:PHP 5.3.10和 PHP 5.4.3,PHP 5.3使用apt-get安装,PHP 5.4使用编译安装,测试页面代码,只有一行phpinfo(); php设置均为默认,没有调整。

测试环境:

  • 操作系统:ubuntu 12.04
  • CPU:Pentium(R) Dual-Core CPU E6600 @ 3.06GHz × 2
  • 内存:4GB
  • HTTP服务器:Apache 2.2
  • 测试工具:ab (ab -n 1000 -c 100 url)

测试数据:

PHP 5.3 PHP 5.4
Time taken for tests 0.939 seconds 0.577 seconds
Complete requests 1000 1000
Failed requests 0 105(Length: 105)
Requests per second 1065.53 [#/sec] (mean) 1733.73 [#/sec] (mean)
Time per request 93.850 [ms] (mean) 57.679 [ms] (mean)

从数据中可以看到5.4比5.3确实快了不少,有60-70%左右的提高,但是不知道怎么会有105个失败,ab显示的失败信息如下:

Failed requests:        105
(Connect: 0, Receive: 0, Length: 105, Exceptions: 0)

不知道这个Length什么意思?

ps:关于Failed requests的Length

只要出現 Failed requests 就會多出現一行要求失敗的各原因的數據統計,分別有 Connect, Length, 與 Exception 三種,分別代表的意義為:

  • Connect 無法送出要求、目標主機連接失敗、要求的過程中連線被中斷
  • Length 回應的內容長度不一致 ( 以 Content-Length 標頭值為判斷依據 )
  • Exception 發生無法預期的錯誤

而從上述說明就可以很明顯看出所有的 Failed requests 都落在 Length 這個類別上,原來這是因為受測網站的首頁是動態的內容,當第一次發出 HTTP request 與後續發出的 HTTP request 所得到回應的 HTML 長度都是不同大小的 ( 每次回應的 Content-Length 大小不一致 ),才會引發 Failed requests 的 Length 問題的失敗,因此這類 Length 不一致的失敗在進行「動態網頁」壓力測試時是合理的,可以不予理會。

這裡的 Length 是以 “第 1 次” 取得的 Content-Length 為主,如果第 2 次以後的 HTTP Request 所得到的 HTTP Response Header 得到的 Content-Length 與第 1 次取得的長度不一致,就會得到 Length 的錯誤。