使用 PHP int 的开销是多少?

2022-01-14 00:00:00 int size php

我一直听说 PHP 有开销.例如,C++ int 在 32 位系统上使用 4 个字节,但 PHP int 使用更多.这个值是多少?

I keep hearing that PHP has overhead. For example a C++ int uses 4 Bytes on a 32 bit system but a PHP int uses more. What is this value?

推荐答案

我需要比评论更多的空间来扩展 mario 的发现,所以我将添加一个答案.

I need more space than a comment to expand on mario's findings so I'll add an answer instead.

C union 的大小将是其最大成员的大小(可能带有额外的字节以满足对齐约束).对于 zvalue_value,这将是具有三个指针大小的 obj(不包括这些指针指向的内存所需的内存):

The size of a C union will be the size of its largest member (possibly with extra bytes to satisfy alignment constraints). For zvalue_value, that would be the obj which has the size of three pointers (not including the memory required for what those pointers point to):

typedef struct _zend_object {
    zend_class_entry *ce;
    HashTable *properties;
    HashTable *guards; /* protects from __get/__set ... recursion */
} zend_object;

在 32 位系统上,zend_object 将占用 24 个字节,而在 64 位系统上将占用 48 个字节.因此,每个 zvalue_value 将至少占用 24 或 48 个字节,无论您在其中存储什么数据.还有消耗更多内存的变量的名称;一旦编译器完成,编译语言通常会丢弃名称并将值视为简单的字节序列(因此 double 占用八个字节, char 占用一个字节,等等..).

On a 32bit system, a zend_object will take 24 bytes while on a 64bit system it will take 48 bytes. So, every zvalue_value will take at least 24 or 48 bytes regardless of what data you store in it. There's also the name of the variable which consumes more memory; compiled languages generally discard the names once the compiler is done and treat values as simple sequences of bytes (so a double takes eight bytes, a char takes one byte, etc...).

关于您最近关于 PHP 布尔值的问题,一个简单的布尔值将消耗 24 或 48 个字节作为值,再加上几个字节作为名称,再加上 4 或 8 个字节作为 zend_unit, 加上四个(或八个)来表示这两个 zend_uchar:

With regards to your recent questions about PHP booleans, a simple boolean value will consume 24 or 48 bytes for the value, plus a few more bytes for the name, plus four or eight for the zend_unit, plus four (or eight) for the two zend_uchars in this:

struct _zval_struct {
    /* Variable information */
    zvalue_value value;     /* value */
    zend_uint refcount__gc;
    zend_uchar type;    /* active type */
    zend_uchar is_ref__gc;
};

由于对齐限制,zend_uchar 成员将占用四个(或八个)字节,几乎每个 CPU 都希望访问自然地址边界上的内存,这意味着 zend_uchar 成员将占用四个(或八个)字节code>struct 将占用 4 个字节或 8 个字节的内存(取决于 CPU 的自然字长和对齐约束).因此,布尔值将占用 36 到 72 字节的内存.

The zend_uchar members will chew up four (or eight) bytes due to alignment constraints, almost every CPU wants to access memory on natural address boundaries and that means that a single byte sized member of a struct will take up four bytes or eight bytes of memory (depending on the CPUs natural word size and alignment constraints). So, a boolean will take somewhere between 36 and 72 bytes of memory.

相关文章