php中null是否比false和0更有效率

查看:79
本文介绍了php中null是否比false和0更有效率的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

问 题

因为我推断null的内存地址空间是没有值的,而其他两个有地址

解决方案

以下论点全部基于PHP 5

根据php 5.6zval类型(PHP 7中结构有变化)

typedef struct _zval_struct zval;
...
struct _zval_struct {
    /* Variable information */
    zvalue_value value;     // 值
    zend_uint refcount__gc; // 引用计数,默认 1
    zend_uchar type;    // 变量类型
    zend_uchar is_ref__gc; // 是否是引用,默认 0
};

zend_uchar typetype的值可以为

IS_NULL
IS_BOOL
IS_LONG
IS_DOUBLE
IS_STRING
IS_ARRAY
IS_OBJECT
IS_RESOURCE

PHP是根据type来区分变量的类型

结论

所以nullphp来说,与bool/long对比, 并没有什么特殊的优势

没有优势

null变量,表示zvalue_value value无需赋值,相比StringArray需要申请大量内存的操作来说,还是具备一定的优势,但是对比LONGBOOL来说,这点性能优势基本可以忽略,解释如下:

zVal 是什么

小到一个bool值,大到一个复合数组,在php核心实现中,都是C语言的zVal结构
归纳起来,也就是如下PHP声明:

$n = null;
$a = true;
$b = 123;
$c = 321.123;
$d = 'string';
$e = [];
$f = new SomeClass();
$g = fopen('xxx', 'r');
$h = &$b; //引用,比较特殊

以上变量,在/usr/bin/php执行到这行时,都会在内存中转化为zVal结构type的值上面已经讲解过,下面讲解其值将如何存储,

zvalue_value value 的结构

PHP变量的值存储在zvalue_value value变量中,其中zvalue_value的结构如下:

typedef union _zvalue_value {
    long lval; //整形         
    double dval; //浮点         
    struct { //字符串
        char *val;
        int len;
    } str;
    HashTable *ht; //数组, 也就是hashmap
    zend_object_value obj; // Object
} zvalue_value;

union在C语言里面是一个联合体,表示一次只会一个成员生效,其特点是内存的长度=最长的那个成员长度。
PHP变量使用的成员如下:

NULL      不使用
BOOL/LONG 使用    lval;
DOUBLE    使用    dval;
String    使用    str;
Array     使用    ht;
Resource  使用    lval;
Object    使用    obj;

其中ObjectResourceArray的实现会非常复杂,不在本文讨论之列,详情请查看文本底部的超级链接。

根据上表,NULL类型的变量在设置type = IS_NULL之后,而无需赋值value
0/false赋值在设置type = IS_BOOL / IS_LONG之后,再多一句赋值value.lval = 0;的操作:

然而不论value中的成员是否赋值,zvalue_value value都是需要占用内存的,

如此而来,NULL仅仅是少一个赋值 4 bytes内存 的过程,但是以现代的CPU来看,这点优势可以忽略不计

具体请看http://www.php-internals.com/...

这篇关于php中null是否比false和0更有效率的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆