繁体   English   中英

PHP数组的内存使用情况

[英]PHP arrays memory usage

我正在尝试找到一种将大量字符串映射到int的方法。 我使用数组尝试了一下,发现了我不理解的行为。 当我按字符串索引数组(array('someStirng'=> 1))时,它消耗的内存少于反之(array(1 =>'someString'))。 这是否意味着,最好按字符串对数组进行索引,然后将int用作大量的string-int对的值,或者有什么用呢? 为什么会有这么大的内存分配差异?

function gen() {
    static $characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
    $randomString = '';
    for ($i = 0; $i < 8; $i++) {
        $randomString .= $characters[rand(0, strlen($characters) - 1)];
    }
    return $randomString;
}

按字符串索引-返回490 KB

$a = array();

for($x = 0;$x < 100000;$x++){
    $a[gen()]  = $x;
}


echo (memory_get_usage() / 1024) . ' KB';

按整数索引-返回10790.2890625 KB(比第一种情况多22倍,但存储的信息量相同!)

$a = array();

for($x = 0;$x < 100000;$x++){
    $a[$x]  = gen();
}


echo (memory_get_usage() / 1024) . ' KB';

当我使用代码重复实验时,整数索引得到18 072 000字节,字符串索引得到16 471 960字节。 差别不大,这可以归因于数组键及其值的不同内存管理。

使用memory_get_peak_usage(true)会产生非常相似的结果。 计算在for循环之前和之后的内存使用差异,我得到了18 087 936字节(带整数索引)和16 515 072字节(带字符串索引)。

这是一个很小的差异,可以通过对数组键和数组值进行不同的内部内存管理来解释。 也许因为数组键仅限于标量而数组值不受限制,所以PHP可以在某个地方进行优化。

无论如何,就像@ ed-heal所说的那样,无论您想做什么,都使用最佳的数据结构。 内存使用可能不是那么重要,如果不是那么PHP可能不是该工具。

这个循环

 for ($i = 0; $i < 8; $i++) {

有八次做生意

哪里像这个循环

for($x = 0;$x < 100000;$x++){

还有一点!

现在让我考虑问题出在哪里...

编辑

只是注意到沙子已经变了。

使用适合于手头任务的任何数据结构。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM