cari

Rumah  >  Soal Jawab  >  teks badan

Adakah null lebih cekap daripada false dan 0 dalam php?

Kerana saya membuat kesimpulan bahawa ruang alamat memori null tidak mempunyai nilai, manakala dua lagi mempunyai alamat

伊谢尔伦伊谢尔伦2810 hari yang lalu497

membalas semua(2)saya akan balas

  • PHPz

    PHPz2017-05-16 13:19:02

    Argumen berikut semuanya berdasarkan 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 Berdasarkan jenis zval php 5.6 (struktur telah berubah dalam PHP 7) rrreee Nilai type

    zend_uchar type boleh menjadi

    rrreee

    PHP membezakan jenis pembolehubah berdasarkan type🎜

    Kesimpulan

    🎜Jadi null tidak mempunyai kelebihan istimewa untuk php berbanding dengan bool/long🎜

    Tiada kelebihan

    🎜null pembolehubah bermakna zvalue_value value tidak perlu diberikan nilai Berbanding dengan String dan Array, yang memerlukan sejumlah besar aplikasi memori Yang berkata, ia masih mempunyai kelebihan tertentu, tetapi berbanding dengan LONG dan BOOL, kelebihan prestasi ini pada dasarnya boleh diabaikan seperti berikut: 🎜

    Apakah itu zVal

    🎜Sekecil nilai bool, sebesar tatasusunan komposit, dalam pelaksanaan teras php, kesemuanya adalah struktur zVal bahasa C.
    Ringkasnya, ia adalah pernyataan PHP berikut: 🎜 rrreee 🎜Pembolehubah di atas, apabila /usr/bin/php dilaksanakan ke baris ini, akan ditukar kepada nilai zVal structure dan type dalam ingatan Ia telah dijelaskan di atas, dan sekarang kami akan menerangkan bagaimana nilainya akan disimpan, 🎜

    Struktur zvalue_value value

    🎜Nilai pembolehubah PHP disimpan dalam pembolehubah zvalue_value value, dengan struktur zvalue_value adalah seperti berikut: 🎜 rrreee 🎜kesatuan ialah kesatuan dalam bahasa C, yang bermaksud bahawa hanya satu ahli akan berkuat kuasa pada satu-satu masa Cirinya ialah panjang 🎜memori🎜=🎜panjang antara ahli paling lama🎜 .
    Ahli yang digunakan oleh pembolehubah PHP adalah seperti berikut: 🎜 rrreee 🎜🎜Pelaksanaan Objek, Sumber dan Array akan menjadi sangat rumit dan tidak dibincangkan dalam artikel ini untuk butiran, sila semak hiperpautan di bahagian bawah teks. 🎜 🎜Mengikut jadual di atas, selepas menetapkan type = IS_NULL kepada pembolehubah jenis NULL, tidak perlu untuk menetapkan value
    dan 0/ false Tugasan Selepas menetapkan type = IS_BOOL / IS_LONG, tambah satu lagi tugasan value.lval = 0;: 🎜 🎜Walau bagaimanapun, tidak kira sama ada ahli dalam value diberi nilai atau tidak, zvalue_value value masih 🎜perlu mengisi memori 🎜, 🎜 🎜Dengan cara ini, NULL hanyalah kurang satu proses untuk memperuntukkan memori 4 bait, tetapi dari perspektif CPU moden, 🎜kelebihan ini boleh diabaikan🎜. 🎜 🎜Sila lihat http://www.php-internals.com/...🎜 untuk butiran

    balas
    0
  • 世界只因有你

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

    Ia boleh diabaikan dalam projek sebenar

    balas
    0
  • Batalbalas