LoginSignup
16
14

More than 5 years have passed since last update.

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

Posted at

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の半分のサイズになっているとのことなので概ねそんな感じかなと。

16
14
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
16
14