PHP数组内存使用情况


PHP arrays memory usage

我正试图找到一种将大量字符串映射到int的方法。我使用数组进行了尝试,发现了一种我不理解的行为。当我按字符串索引数组(数组('someStirng'=>1))时,它消耗的内存比字符串(数组(1=>'someString'))消耗的内存少。这是否意味着,最好通过字符串对数组进行索引,并将int作为大量字符串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';

按int索引-返回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++) {

有8次做它的业务

作为这个循环

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

多做一点!

现在让我想想问题出在哪里。。。

编辑

只是注意到沙子变了。

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

相关文章: