为什么 PHP 不对字符串使用内部智能字符串?
Why doesn't PHP use internal smart string for strings?
PHP 有一个称为智能字符串 (smart_str?) 的内部数据结构,它们在其中存储长度和缓冲区大小。也就是说,分配比字符串长度更多的内存以提高连接性能。为什么这个数据结构不用于实际的 PHP 字符串?这不会导致更少的内存分配和更好的性能吗?
普通 PHP 字符串(从 PHP 7 开始)由 zend_string
类型表示,其中包括字符串的长度及其字符数据数组。 zend_string
s 通常被分配以精确地适应字符数据(尽管对齐):它们不会留下空间来附加额外的字符。
smart_str
结构包括指向 zend_string
的指针和分配大小。这一次,zend_string
将 而不是 被精确分配。相反,分配将变得太大,因此可以附加额外的字符而无需昂贵的重新分配。
smart_str
的重新分配策略如下:首先,它将分配总大小为 256 字节(减去 zend_string header,减去分配器开销) .如果超过此大小,它将被重新分配为 4096 字节(减去开销)。之后,大小将以 4096 字节为增量增加。
现在,假设我们用 smart_str
ings 替换所有字符串。这意味着即使是单个字符串也将具有 256 字节的最小分配大小。考虑到大多数使用的字符串都很小,这是不可接受的开销。
所以本质上,这是一个经典的 performance/memory 权衡。我们默认使用 memory-compact 表示,并在从中受益最多的情况下切换到更快但更少的 memory-effective 表示,即大字符串由小部分构成的情况。
PHP 有一个称为智能字符串 (smart_str?) 的内部数据结构,它们在其中存储长度和缓冲区大小。也就是说,分配比字符串长度更多的内存以提高连接性能。为什么这个数据结构不用于实际的 PHP 字符串?这不会导致更少的内存分配和更好的性能吗?
普通 PHP 字符串(从 PHP 7 开始)由 zend_string
类型表示,其中包括字符串的长度及其字符数据数组。 zend_string
s 通常被分配以精确地适应字符数据(尽管对齐):它们不会留下空间来附加额外的字符。
smart_str
结构包括指向 zend_string
的指针和分配大小。这一次,zend_string
将 而不是 被精确分配。相反,分配将变得太大,因此可以附加额外的字符而无需昂贵的重新分配。
smart_str
的重新分配策略如下:首先,它将分配总大小为 256 字节(减去 zend_string header,减去分配器开销) .如果超过此大小,它将被重新分配为 4096 字节(减去开销)。之后,大小将以 4096 字节为增量增加。
现在,假设我们用 smart_str
ings 替换所有字符串。这意味着即使是单个字符串也将具有 256 字节的最小分配大小。考虑到大多数使用的字符串都很小,这是不可接受的开销。
所以本质上,这是一个经典的 performance/memory 权衡。我们默认使用 memory-compact 表示,并在从中受益最多的情况下切换到更快但更少的 memory-effective 表示,即大字符串由小部分构成的情况。