PHP中交互变量的优化

来源:互联网 发布:游戏王 游戏 知乎 编辑:程序博客网 时间:2024/06/05 23:46

在编程中,我们大多考虑是功能的实现,很少过多的考虑内存消耗问题。比如在交换两个变量的值,大多时候我们是通过第三个变量来进行交换的,真的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是比较消耗内存的。

0 0