Adakah null lebih cekap daripada false dan 0 dalam php?
伊谢尔伦
伊谢尔伦 2017-05-16 13:17:02
0
2
489

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

伊谢尔伦
伊谢尔伦

小伙看你根骨奇佳,潜力无限,来学PHP伐。

membalas semua(2)
PHPzhong

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
世界只因有你

Ia boleh diabaikan dalam projek sebenar

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan