刚刚一个群里有人引出了 PHP 数组和对象占用内存谁多谁少的问题。我想起之前我好像也测试过这个问题,和群里人说的对象比数组节省内存的结论相反,我得出的是数组比对象节省内存

但今天,我想说,这两种说法都不对!!!

话不多说,直接上代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
 /**
 * 随机生成文本
 * @param int $length
 * @return string
 */
function randomText($length)
{
    $chars 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
    $charLength = mb_strlen($chars);
    $result '';
    for($i = 0; $i $length; ++$i)
    {
        $result .= mb_substr($chars, mt_rand(1, $charLength) - 1, 1);
    }
    return $result;
}
 
class AAA
{
    public $a,$b,$c,$d,$e;
      
    public function __construct(...$v)
    {
        $this->a = $v[0];
        $this->b = $v[1];
        $this->c = $v[2];
        $this->d = $v[3];
        $this->e = $v[4];
    }
}
  
$max = 10000;
  
$a = memory_get_usage();
$list1 = [];
for($i = 0; $i $max; ++$i)
{
    $list1[] = ['a'=>randomText(16), 'b'=>randomText(16), 'c'=>randomText(16), 'd'=>randomText(16), 'e'=>randomText(16)];
}
echo 'PHP 数组内存占用:', memory_get_usage() - $a, PHP_EOL;
  
$a = memory_get_usage();
$list2 = [];
for($i = 0; $i $max; ++$i)
{
    $obj new stdClass();
    $obj->a = randomText(16);
    $obj->b = randomText(16);
    $obj->c = randomText(16);
    $obj->d = randomText(16);
    $obj->e = randomText(16);
    $list2[] = $obj;
}
echo 'PHP stdClass内存占用:', memory_get_usage() - $a, PHP_EOL;
  
$a = memory_get_usage();
$list3 = [];
for($i = 0; $i $max; ++$i)
{
    $list3[] = new AAA(randomText(16),randomText(16),randomText(16),randomText(16),randomText(16));
}
echo 'PHP 自定义类内存占用: ', memory_get_usage() - $a, PHP_EOL;

运行结果:(不同人跑结果不同,但是谁多谁少不会变)

PHP 数组内存占用:6688472

PHP stdClass内存占用:7211320

PHP 自定义类内存占用: 4339512

结论:PHP 数组、对象内存占用,自定义类<数组<stdClass

相关评论(0)
您是不是忘了说点什么?

友情提示:垃圾评论一律封号...

还没有评论,快来抢沙发吧!