background image

PHP

 

     数组实际占用内存大小的分析

 

 

我们在前面的 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 个字节。而纯 

 

中整体只需要 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>';