Help us understand the problem. What is going on with this article?

PHPのパフォーマンス比較(5.3〜7.0)

More than 3 years have passed since last update.

PHP5.3から7までのパフォーマンスを比較してみました。

環境

こちらの記事を参考にさせていただき、Vagrant でテスト環境を用意します。

各PHPのバージョン
vagrant@php7dev:/var/www/default$ php53 -v
PHP 5.3.30-dev (cli) (built: Jan 29 2015 17:42:37) 
vagrant@php7dev:/var/www/default$ php54 -v
PHP 5.4.46-dev (cli) (built: Oct 22 2015 16:34:09) 
vagrant@php7dev:/var/www/default$ php55 -v
PHP 5.5.31-dev (cli) (built: Oct 22 2015 16:24:08) 
vagrant@php7dev:/var/www/default$ php56 -v
PHP 5.6.16-dev (cli) (built: Oct 22 2015 16:13:30) 
vagrant@php7dev:/var/www/default$ php7 -v
PHP 7.0.0-dev (cli) (built: Oct 22 2015 19:38:21) ( NTS )

マシンは Macbook Pro 13インチです。

スクリーンショット 2015-12-23 17.06.18.png

比較1

フィボナッチ数を計算して、処理時間とメモリ使用量を見てみます。

fibonacci.php
<?php
function fibonacci($n)
{
    if ($n < 2) {
        return $n;
    }
    return fibonacci($n - 2) + fibonacci($n - 1);
}

$time_start = microtime(true);
$temp = fibonacci(38);
$time_end = microtime(true);

echo 'time : ' . ($time_end - $time_start) . ' sec     ' .
     'mem : ' . (memory_get_usage() / 1024 / 1024) . ' MB' . PHP_EOL;

実行は下記のようにコマンドラインから5回ずつ行いました。
php53 の部分は各バージョンに置き換えてください。

5回実行する
$ for i in {0..4}; do php53 fibonacci.php; done;

結果

$ for i in {0..4}; do php53 fibonacci.php; done;
time : 8.8745021820068 sec     mem  : 0.59640502929688 MB
time : 8.340313911438 sec      mem  : 0.59640502929688 MB
time : 9.9600381851196 sec     mem  : 0.59640502929688 MB
time : 9.4626259803772 sec     mem  : 0.59640502929688 MB
time : 9.5003471374512 sec     mem  : 0.59640502929688 MB

$ for i in {0..4}; do php54 fibonacci.php; done;
time : 7.6157579421997 sec     mem  : 0.21370697021484 MB
time : 8.6955020427704 sec     mem  : 0.21370697021484 MB
time : 6.9724881649017 sec     mem  : 0.21370697021484 MB
time : 6.9245629310608 sec     mem  : 0.21370697021484 MB
time : 7.2523899078369 sec     mem  : 0.21370697021484 MB

$ for i in {0..4}; do php55 fibonacci.php; done;
time : 6.5647640228271 sec     mem  : 0.21321105957031 MB
time : 6.6234068870544 sec     mem  : 0.21321105957031 MB
time : 6.6727700233459 sec     mem  : 0.21321105957031 MB
time : 6.7943079471588 sec     mem  : 0.21321105957031 MB
time : 7.0112040042877 sec     mem  : 0.21321105957031 MB

$ for i in {0..4}; do php56 fibonacci.php; done;
time : 7.3396279811859 sec     mem  : 0.21321868896484 MB
time : 8.8106920719147 sec     mem  : 0.21321868896484 MB
time : 7.6103270053864 sec     mem  : 0.21321868896484 MB
time : 6.5883009433746 sec     mem  : 0.21321868896484 MB
time : 7.0513398647308 sec     mem  : 0.21321868896484 MB

$ for i in {0..4}; do php7 fibonacci.php; done;
time : 2.2508449554443 sec     mem  : 0.3321533203125 MB
time : 2.3575670719147 sec     mem  : 0.3311767578125 MB
time : 2.1691491603851 sec     mem  : 0.3311767578125 MB
time : 2.0446121692657 sec     mem  : 0.3311767578125 MB
time : 2.1461308002472 sec     mem  : 0.3311767578125 MB

平均

バージョン 実行時間(秒) メモリ(MB)
5.3 9.227565479 0.596405029
5.4 7.492140198 0.213706970
5.5 6.733290577 0.213211060
5.6 7.480057573 0.213218689
7.0 2.193660831 0.331372070

PHP7の実行時間が突出して短くなっていますね。
ただPHP7でメモリ使用量が削減されたはずですが、この処理では過去のバージョンと比較して多くなっていますね。関数を呼んでいるだけなので、新たにメモリが確保されないのか。

比較2

メモリの使用量について見てみたいので、単純に連想配列を作成する際の結果を比較してみます。

array_test.php
<?php
$time_start = microtime(true);
$i = range(0, 1000000);
$new = array();
foreach ($i as $i) {
    $k = 'key' . $i;
    $new[$k] = $i;
}
$time_end = microtime(true);

echo 'time : ' . ($time_end - $time_start) . ' sec     ' .
     'mem : ' . (memory_get_usage() / 1024 / 1024) . ' MB' . PHP_EOL;

結果

$ for i in {0..4}; do php53 array_test.php; done;
time : 0.38774800300598 sec     mem : 152.79147338867 MB
time : 0.40927910804749 sec     mem : 152.79147338867 MB
time : 0.36143684387207 sec     mem : 152.79147338867 MB
time : 0.33564782142639 sec     mem : 152.79147338867 MB
time : 0.38382601737976 sec     mem : 152.79147338867 MB

$ for i in {0..4}; do php54 array_test.php; done;
time : 0.3762321472168 sec      mem : 153.09534454346 MB
time : 0.39958381652832 sec     mem : 153.09535980225 MB
time : 0.38534998893738 sec     mem : 153.09535980225 MB
time : 0.39422106742859 sec     mem : 153.09535980225 MB
time : 0.35958099365234 sec     mem : 153.09535980225 MB

$ for i in {0..4}; do php55 array_test.php; done;
time : 0.34950494766235 sec     mem : 153.09490966797 MB
time : 0.31725001335144 sec     mem : 153.09490966797 MB
time : 0.36130309104919 sec     mem : 153.09490966797 MB
time : 0.3703031539917 sec      mem : 153.09488677979 MB
time : 0.36027407646179 sec     mem : 153.09490966797 MB

$ for i in {0..4}; do php56 array_test.php; done;
time : 0.36537909507751 sec     mem : 153.09491729736 MB
time : 0.35702300071716 sec     mem : 153.09491729736 MB
time : 0.35819411277771 sec     mem : 153.09491729736 MB
time : 0.30669116973877 sec     mem : 153.09491729736 MB
time : 0.33337306976318 sec     mem : 153.09491729736 MB

$ for i in {0..4}; do php7 array_test.php; done;
time : 0.13665795326233 sec     mem : 74.404922485352 MB
time : 0.10781693458557 sec     mem : 74.404922485352 MB
time : 0.13959193229675 sec     mem : 74.404922485352 MB
time : 0.14009881019592 sec     mem : 74.404922485352 MB
time : 0.14135408401489 sec     mem : 74.404922485352 MB

平均

バージョン 実行時間(秒) メモリ(MB)
5.3 0.375587559 152.7914734
5.4 0.382993603 153.0953568
5.5 0.351727057 153.0949051
5.6 0.344132090 153.0949173
7.0 0.133103943 74.40492249

実行時間、メモリ使用量ともにPHP7が大きく削減されていますね :thumbsup:

比較3

最後にWebサーバ経由でアクセスしてみます。
この環境は nginx 1.8.0 + PHP-FPM で動作しています。

またPHP-FPMの切り替えは、コマンドラインから以下のようにして行うことができます。

PHP5.5からPHP7に切り替え
$ sudo service php55-fpm stop;
$ sudo service php-fpm start

ドキュメントルートに Fuelphp をデフォルト状態で置いて、確認してみます。
100クライアントから10回ずつアクセスが来た想定で、以下のようにテストします。

ローカルから実行
$ ab -n 1000 -c 100 http://192.168.33.10/public/

結果(抜粋)

# php 5.3
Concurrency Level:      100
Time taken for tests:   26.637 seconds
Complete requests:      1000
Failed requests:        85
   (Connect: 0, Receive: 0, Length: 85, Exceptions: 0)
Total transferred:      28978908 bytes
HTML transferred:       28812908 bytes
Requests per second:    37.54 [#/sec] (mean)
Time per request:       2663.728 [ms] (mean)
Time per request:       26.637 [ms] (mean, across all concurrent requests)
Transfer rate:          1062.41 [Kbytes/sec] received

# php 5.4
Concurrency Level:      100
Time taken for tests:   26.427 seconds
Complete requests:      1000
Failed requests:        99
   (Connect: 0, Receive: 0, Length: 99, Exceptions: 0)
Total transferred:      28978890 bytes
HTML transferred:       28812890 bytes
Requests per second:    37.84 [#/sec] (mean)
Time per request:       2642.657 [ms] (mean)
Time per request:       26.427 [ms] (mean, across all concurrent requests)
Transfer rate:          1070.88 [Kbytes/sec] received

# php 5.5
Concurrency Level:      100
Time taken for tests:   25.935 seconds
Complete requests:      1000
Failed requests:        106
   (Connect: 0, Receive: 0, Length: 106, Exceptions: 0)
Total transferred:      28978875 bytes
HTML transferred:       28812875 bytes
Requests per second:    38.56 [#/sec] (mean)
Time per request:       2593.493 [ms] (mean)
Time per request:       25.935 [ms] (mean, across all concurrent requests)
Transfer rate:          1091.18 [Kbytes/sec] received

# php 5.6
Concurrency Level:      100
Time taken for tests:   25.884 seconds
Complete requests:      1000
Failed requests:        85
   (Connect: 0, Receive: 0, Length: 85, Exceptions: 0)
Total transferred:      28978904 bytes
HTML transferred:       28812904 bytes
Requests per second:    38.63 [#/sec] (mean)
Time per request:       2588.385 [ms] (mean)
Time per request:       25.884 [ms] (mean, across all concurrent requests)
Transfer rate:          1093.33 [Kbytes/sec] received

# php 7.0
Concurrency Level:      100
Time taken for tests:   26.317 seconds
Complete requests:      1000
Failed requests:        100
   (Connect: 0, Receive: 0, Length: 100, Exceptions: 0)
Total transferred:      29262892 bytes
HTML transferred:       29097892 bytes
Requests per second:    38.00 [#/sec] (mean)
Time per request:       2631.733 [ms] (mean)
Time per request:       26.317 [ms] (mean, across all concurrent requests)
Transfer rate:          1085.86 [Kbytes/sec] received

10%ぐらいFailしていますね、、、意味のデータかもしれませんが、一応載せておきます。

比較

バージョン Requests per second Time per request (ms)
5.3 37.54 26.637
5.4 37.84 26.427
5.5 38.56 25.935
5.6 38.63 25.884
7.0 38.00 26.317

うーん、こんなのを期待していたのですが、、、テスト方法を見なおしてまたやってみます。

参考にしたサイト

【PHP】 PHP5.4系とPHP7系のパフォーマンスを比較してみた
http://deadcode.hatenablog.jp/entry/2015/11/04/171450

PHP7を試してみた
http://befool.co.jp/blog/chainzhang/first-taste-of-php7/

quad
デザインとテクノロジーで新しい価値を作り出す。
https://quad.co.jp/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした