使用包 ramsey/uuid我尝试生成大量 uuids v4。
<?php
require __DIR__ . '/vendor/autoload.php';
use Ramsey\Uuid\Uuid;
$initialMemoryUsage = memory_get_usage(true) / 1024 / 1024;
$test = [];
for ($i = 0; $i < 100000; $i++) {
$test[] = Uuid::uuid4()->toString();
}
var_dump(sprintf('Memory used: %d MB', (memory_get_usage(true) / 1024 / 1024) - $initialMemoryUsage));
输出:string(18) "已用内存:10 MB"
<?php
$initialMemoryUsage = memory_get_usage(true) / 1024 / 1024;
$test = [];
for ($i = 0; $i < 100000; $i++) {
$test[] = '97c2ca84-bcfe-4618-b8a3-4d404eead37a';
}
var_dump(sprintf('Memory used: %d MB', (memory_get_usage(true) / 1024 / 1024) - $initialMemoryUsage));
输出 string(17) "已用内存:4 MB"
仅仅调用uuid生成不会导致任何内存增加
for ($i = 0; $i < 100000; $i++) {
Uuid::uuid4()->toString();
}
为什么在这两种情况下结果都是包含 100000 个元素的 string(36) 数组,但使用的内存量不同?有什么想法吗?
php -v
PHP 7.3.2-3+ubuntu16.04.1+deb.sury.org+1 (cli) (built: Feb 8 2019 15:43:26) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.3.2, Copyright (c) 1998-2018 Zend Technologies
最佳答案
PHP 中的字符串是不可变的,这意味着它们无法更改。这也意味着它们可以很容易地共享。在第一种情况下,您有一个包含 100k 元素的数组,每个元素引用不同的字符串。在第二种情况下,您有一个包含 100k 元素的数组,每个元素都引用相同的字符串。
如需进一步引用,请查看 www.phpinternalsbook.com .
关于php - 字符串数组中奇怪的 PHP 内存使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64446071/