1. Qiita
  2. 投稿
  3. PHP

PHP7とPHP5.6でメモリ使用量をくらべてみる

  • 14
    いいね
  • 0
    コメント
この記事は最終更新日から1年以上が経過しています。

PHP7がリリースされたので下記スクリプトで配列を10万個作ってメモリの使用量を比べてみる。

PHP7のインストール

PHP7はDockerでインストール

git clone https://github.com/docker-library/php
cd php/7.0/
docker build -t pman/php7 ./
docker images
pman/php7                latest              0aa7a4b8159c        2 hours ago        488.6 MB

488MB...でかい。

スクリプトを実行

スクリプトは下記で実行。今いるディレクトリに実行するPHPファイルがある前提でdocker側の/usr/src/myappを結びつけてそのスクリプトを実行しています。

docker run -it --rm --name php7 -v `pwd`:/usr/src/myapp pman/php7 php /usr/src/myapp/test.php 

スクリプト

<?php
$a = [];
for($i=0;$i<100000;$i++){
    $a[] = $i;
}

//$b = $a;
//$b[0] = 0;
print memory_get_usage() ."\n";

結果

バージョン メモリ使用量(バイト)
php7 4,544,416
php5.6 14,869,384

Copy On Write

配列のコピーがCopy On Writeなのを確認。
一つでもコピーした配列の中を変更すると全てのデータがコピーされる。

配列をコピー

殆どメモリ使用量は増えない

スクリプト

<?php
$a = [];
for($i=0;$i<100000;$i++){
    $a[] = $i;
}

$b = $a;
//$b[0] = 0;
print memory_get_usage() ."\n";

結果

バージョン メモリ使用量(バイト)
php7 4,544,520
php5.6 14,869,584

コピーした配列のひとつを変更

配列の値もコピーするのでメモリがかなり増える。

スクリプト

<?php
$a = [];
for($i=0;$i<100000;$i++){
    $a[] = $i;
}

$b = $a;
$b[0] = 0;
print memory_get_usage() ."\n";

結果

バージョン メモリ使用量(バイト)
php7 8,743,160
php5.6 24,718,536

整数の配列をコピーしたときに5.6だと9,848,952バイト、7だと4,198,640バイト増えています。
整数のzvalがポインタと合わせて7は5.6の半分のサイズになっているとのことなので概ねそんな感じかなと。