はじめまして。JWord holyです。
今回は、PHP7.0.0について話したいと思います。
12/3(木)、PHPはバージョン7.0.0をリリースしました。
PHP7.0.0のリリース内容を一部抜粋すると、
・「PHP 5.6」と比較して2倍以上のパフォーマンス向上
・メモリ使用量の劇的な削減
・64ビットのサポートを実現
などが対応しているそうです。
なので本当に向上しているのか、検証してみようと思います。
検証について
検証については、下記の内容を参考にし、5系の最新バージョン5.6.16と7.0.0の比較を行います。
実験方法
まず 10 万件の配列を生成します。
これをループで回して、変数に代入します。
この処理を 100 回行い、「最大メモリ使用量との差分値」と「処理時間」をそれぞれ計測します。
以下が、サンプルプログラムです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
$baseMemoryUsage = memory_get_usage(); $baseTime = microtime(true); for ($i = 0; $i < 100; $i++) { $data = range(1, 100000); // 1.1~3.2の各ループ処理を貼り付け Start // 1.1~3.2の各ループ処理を貼り付け End $data = null; } $maxMemoryUsage = (memory_get_peak_usage() - $baseMemoryUsage) / (1024 * 1024); $processTime = microtime(true) - $baseTime; printf("Max Memory Usage : %.3f [MB]\n", $maxMemoryUsage); printf("Process Time : %.2f [s]\n", $processTime); |
1. foreach
1.1. 通常パターン
PHP では一番よく使うループ文なので、この計測がベースになります。
1 2 3 4 |
$output = []; foreach ($data as $value) { $output[] = $value; } |
1.2. メモリ節約パターン
1 2 3 4 5 |
$output = []; foreach ($data as $key => $value) { $output[] = $value; unset($data[$key]); } |
1.3. 通常パターン(参照渡し)
1 2 3 4 |
$output = []; foreach ($data as &$value) { $output[] = $value; } |
1.4. メモリ節約パターン(参照渡し)
1 2 3 4 5 |
$output = []; foreach ($data as &$value) { $output[] = $value; unset($value); } |
2. while
2.1. 通常パターン
1 2 3 4 |
$output = []; while (list(, $value) = each($data)) { $output[] = $value; } |
2.2. メモリ節約パターン
1 2 3 4 5 |
$output = []; while (list($key, $value) = each($data)) { $output[] = $value; unset($data[$key]); } |
3. for
3.1. 通常パターン
1 2 3 4 |
$count = count($data); for ($j = 0; $j < $count; $j++) { $output[] = $data[$j]; } |
3.2. メモリ節約パターン
1 2 3 4 5 6 |
$output = []; $count = count($data); for ($j = 0; $j < $count; $j++) { $output[] = $data[$j]; unset($data[$j]); } |
検証サーバについて
上記の実験内容を、vmのLinuxサーバを使って、検証を行いました。
OS | : | CentOS release 6.5 (Final) |
model name[プロセッサ名] | : | Intel(R) Core(TM) i5-4210U CPU @ 1.70GHz |
cpu MHz[プロセッサの動作周波数] | : | 2391.142 |
MemTotal[メモリ搭載量] | : | 603576 kB |
結果
5.6.16 | 7.0.0 | |||||
No. | ループ文 | パターン | メモリ[MB] | 処理時間[s] | メモリ[MB] | 処理時間[s] |
0.0 | NOP | – | 13.972 | 1.9 | 4.004 | 0.13 |
1.1 | foreach | 通常 | 27.961 | 4.2 | 8.008 | 0.67 |
1.2 | foreach | 節約 | 28.198 | 5.36 | 12.012 | 1.12 |
1.3 | foreach | 通常-参照渡し | 27.945 | 4.77 | 10.297 | 0.86 |
1.4 | foreach | 節約-参照渡し | 27.946 | 5.96 | 10.297 | 0.84 |
2.1 | while | 通常 | 28.2 | 11.32 | 8.008 | 2.66 |
2.2 | while | 節約 | 28.052 | 6.7 | 8.008 | 3.2 |
3.1 | for | 通常 | 27.961 | 4.4 | 8.008 | 0.79 |
3.2 | for | 節約 | 28.065 | 3.35 | 8.008 | 0.97 |
検証の結果、PHP5.6.16に比べて、格段にパフォーマンスが上がっていることがわかりました。
弊社の業務システムもPHP5系からPHP7にアップデートしたいです。。
PHP5系からPHP7にアップデートする際の懸念点。
下記のページはPHP7をリリースで削除したモジュールが書いています。
http://php.net/manual/ja/migration70.removed-exts-sapis.php
・ereg
・mssql
・mysql
・sybase_ct
上記でモジュールを使った関数は無効になっているので、関数の変更をする必要があります。
例として、ereg_replace関数をみると、
http://php.net/manual/ja/function.ereg-replace.php
ereg_replace() は PHP 5.3.0 以降で非推奨になりました。この関数のかわりに preg_replace() を使うことを推奨します。
と記載しています。
なので、ereg_replaceからpreg_replaceに変更して、PHP7.0.0をアップデートする形になります。
アップデートするときは、一部関数の変更を行う必要がありますが、これを対応すれば、処理速度等の向上が期待できるので、遅いなと思っている方は是非やってみてください!!