使用 PHP int 的开销是多少?


What is the overhead of using PHP int?

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

我需要比评论更多的空间来扩展马里奥的发现,所以我会添加一个答案。

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

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需要一个字节,等等......

关于您最近关于 PHP 布尔值的问题,一个简单的布尔值将消耗 24 或 48 个字节作为值,加上更多的字节作为名称,加上四个或八个用于zend_unit,加上四个(或八个)用于两个zend_uchar

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 都希望访问自然地址边界上的内存,这意味着struct的单个字节大小的成员将占用四个字节或八个字节的内存(取决于 CPU 的自然字大小和对齐约束)。因此,布尔值将占用 36 到 72 字节的内存。

PHP 不只是存储 C int 。它需要为每个值保留类型信息和其他内容。每个变量还需要其中一个变量范围哈希表中的条目。

不确定这是否是正确的代码片段,但基本上在 PHP 源代码中查找zval

struct _zval_struct {
        /* Variable information */
        zvalue_value value;             /* value */
        zend_uint refcount__gc;
        zend_uchar type;        /* active type */
        zend_uchar is_ref__gc;
};
typedef union _zvalue_value {
        long lval;                                      /* long value */
        double dval;                            /* double value */
        struct {
                char *val;
                int len;
        } str;
        HashTable *ht;                          /* hash table value */
        zend_object_value obj;
} zvalue_value;

大多数类似整数的类型至少使用long。(我认为这将包括您之前问题的布尔值。

http://porteightyeight.com/2008/03/18/the-truth-about-php-variables/