我们在前面的 php 高效写法提到,尽量不要复制变量,特别是数组。一般来说,PHP 数组
的内存利用率只有 1/10, 也就是说,一个在 C 语言里面 100M 内存的数组,在 PHP 里面就
要 1G。下面我们可以粗略的估算 PHP 数组占用内存的大小,首先我们测试 1000 个元素的
整数占用的内存:
<?php
echo memory_get_usage() , '<br>';
$start = memory_get_usage();
$a = Array();
for ($i=0; $i<1000; $i++) {
$a[$i] = $i + $i;
}
$mid = memory_get_usage();
echo memory_get_usage() , '<br>';
for ($i=1000; $i<2000; $i++) {
$a[$i] = $i + $i;
}
$end = memory_get_usage();
echo memory_get_usage() , '<br>';
echo 'argv:', ($mid - $start)/1024 ,'kb' , '<br>';
echo 'argv:',($end - $mid)/1024 ,'kb' , '<br>';
输出是:
350752
435248
519424
argv:84.416byte
argv:84.176byte
大概了解 1000
个元素的整数数组需要占用 82k
内存,平均每个元素占用 84 个字节。而纯
C
中整体只需要 4k(一个整型占用 4byte * 1000 )。memory_get_usage() 返回的结果并不是全
是被数组占用了,还要包括一些 PHP 运行本身分配的一些结构,可能用内置函数生成的
数组更接近真实的空间:
<?php
$start = memory_get_usage(true);
$a = array_fill(0, 10000, 1);
$mid = memory_get_usage(true); //10k elements array;
echo 'argv:', ($mid - $start )/10000,'byte' , '<br>';
$b = array_fill(0, 10000, 1);
$end = memory_get_usage(true); //10k elements array;
echo 'argv:', ($end - $mid)/10000 ,'byte' , '<br>';