찾다

 >  Q&A  >  본문

PHP에서 false와 0보다 null이 더 효율적입니까?

널의 메모리 주소 공간에는 값이 없고 나머지 두 공간에는 주소가 있다고 추론하기 때문입니다

伊谢尔伦伊谢尔伦2890일 전537

모든 응답(2)나는 대답할 것이다

  • PHPz

    PHPz2017-05-16 13:19:02

    다음 인수는 모두 PHP 5PHP 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를 기반으로 합니다. php 5.6zval 유형 기반(PHP 7에서는 구조가 변경됨) 으아아아

    zend_uchar 유형type 값은

    일 수 있습니다. 으아아아

    PHP는 유형을 기준으로 변수 유형을 구별합니다🎜

    결론

    🎜그래서 nullbool/long🎜에 비해 php에 특별한 이점이 없습니다.

    이점 없음

    🎜null 변수는 zvalue_value 값에 값을 할당할 필요가 없음을 의미합니다. StringArray와 비교할 때, 많은 양의 메모리 애플리케이션이 필요합니다. 즉, 여전히 특정 장점이 있지만 LONGBOOL과 비교할 때 이러한 성능 이점은 기본적으로 무시될 수 있습니다. 다음과 같습니다: 🎜

    zVal이란 무엇입니까

    🎜부울 값 만큼 작은 것, 복합 배열만큼 큰 것, php의 핵심 구현에서는 모두 C 언어의 zVal 구조입니다.
    요약하면 다음과 같은 PHP 문입니다: 🎜 으아아아 🎜위 변수들은 이 줄에 /usr/bin/php가 실행되면 zVal 구조체type의 값으로 변환됩니다. 메모리에 위에서 설명했고 이제 그 값이 어떻게 저장되는지 설명하겠습니다. 🎜

    zvalue_value 값

    의 구조 🎜PHP 변수의 값은 zvalue_value 변수에 저장되며, 여기서 zvalue_value의 구조는 다음과 같습니다. 🎜 으아아아 🎜union은 C 언어의 union으로, 한 번에 하나의 멤버만 적용된다는 것을 의미합니다. 그 특징은 🎜memory🎜의 길이=🎜길이입니다. 가장 긴 멤버🎜 .
    PHP 변수가 사용하는 멤버는 다음과 같습니다: 🎜 으아아아 🎜🎜Object, ResourceArray 구현은 매우 복잡하므로 이 문서에서는 다루지 않습니다. 자세한 내용은 다음을 확인하세요. 텍스트 하단의 하이퍼링크. 🎜 🎜위 표에 따르면 type = IS_NULLNULL 유형의 변수로 설정한 후에는 을 할당할 필요가 없습니다.
    0/ false 할당 type = IS_BOOL / IS_LONG을 설정한 후 value.lval = 0; 할당을 하나 더 추가합니다. 🎜 🎜그러나 valuemember에 값이 할당되었는지 여부에 관계없이 zvalue_value 값은 🎜메모리를 점유해야 합니다🎜, 🎜 🎜이런 식으로 NULL4바이트 메모리를 할당하는 과정 중 하나가 줄어든 것에 불과하지만 최신 CPU의 관점에서 보면 🎜이러한 장점은 무시될 수 있습니다🎜. 🎜 🎜자세한 내용은 http://www.php-internals.com/...🎜을 참조하세요.

    회신하다
    0
  • 世界只因有你

    世界只因有你2017-05-16 13:19:02

    실제 프로젝트에서는 무시해도 됩니다

    회신하다
    0
  • 취소회신하다