在编程中,我们大多考虑是功能的实现,很少过多的考虑内存消耗问题。比如在交换两个变量的值,大多时候我们是通过第三个变量来进行交换的,真的php来说,通过第三个变量来交换,是比较消耗内存的。看下面代码
$startMemoryUsed=memory_get_usage();
$i=5;
$j=6;
$c=$i;
$i=$j;
$j=$c;
var_dump('i='.$i.',j='.$j);
$endMemoryUsed=memory_get_usage();
$usedMemory=($endMemoryUsed-$startMemoryUsed)/1024;
var_dump('添加变量交互消耗内存为:'.$usedMemory.'MB');
$startMemoryUsed=memory_get_usage();
$i=5;
$j=6;
$i=$i^$j;
$j=$i^$j;
$i=$i^$j;
var_dump('i='.$i.',j='.$j);
$endMemoryUsed=memory_get_usage();
$usedMemory=($endMemoryUsed-$startMemoryUsed)/1024;
var_dump('异或交互消耗内存为:'.$usedMemory.'MB');现在我们来看一下,内存消耗结果:
这说明如果我们借助第三个变量交互值的话,是通过异或交互消耗内存的9.5倍,不测试不知道,一测试还真的吓一跳啊。
细究其原因,这和php内核中数据结构是分不开的
PHP在内核中是通过zval这个结构体来存储变量的,它的定义在Zend/zend.h文件里,简短精炼,只有四个成员组:
struct _zval_struct {
zvalue_value value; /* 变量的值 */
zend_uint refcount__gc;
zend_uchar type; /* 变量当前的数据类型 */
zend_uchar is_ref__gc;
};
typedef struct _zval_struct zval;
//在Zend/zend_types.h里定义的:
typedef unsigned int zend_uint;
typedef unsigned char zend_uchar;zval里的refcout__gc是zend_uint类型,也就是unsinged int型,is_ref__gc和type则是unsigned char型的。保存变量
值的value则是zvalue_value类型(PHP5),它是一个Union,同样定义在了Zend/zend.h文件里:
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;在以上实现的基础上,PHP语言得以实现了8种数据类型,也真是基于这样的定义,才使得php是比较消耗内存的。
1958

被折叠的 条评论
为什么被折叠?



