刚刚一个群里有人引出了 PHP 数组和对象占用内存谁多谁少的问题。我想起之前我好像也测试过这个问题,和群里人说的对象比数组节省内存的结论相反,我得出的是数组比对象节省内存。
但今天,我想说,这两种说法都不对!!!
话不多说,直接上代码:
/** * 随机生成文本 * @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