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