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
- PHP中交互变量的优化
- php中客户端交互代码的结构设计
- php中交互部分的总结
- javascript中与php交互的方式
- php中变量的声明
- php中变量的使用
- PHP中变量的销毁
- PHP中变量的数据类型
- PHP变量的变量
- PHP中变量的传递小结
- PHP中变量的传递小结
- PHP中 $_SESSION[]变量的使用
- 关于PHP中变量的判定
- php类中变量的应用问题
- PHP中交换两个变量的值
- PHP中变量的作用域
- 关于PHP中变量未定义的提示
- PHP中变量的作用域
- JavaEE初学者
- .Net AOP(三)继承ContextBoundObject方式
- 进制转换
- [dp+树状数组优化] CF597C. Subsequences
- Shape 文件格式解释
- PHP中交互变量的优化
- iOS中的关联对象
- leetcode 20. Valid Parentheses
- leetcode7. Reverse Integer
- TreeSet,Hashset,Set集合转为整型数组
- 299. Bulls and Cows
- 检查C语言的内存问题 参考网址:http://blog.csdn.net/sduliulun/article/details/7732906
- J2EE增删改查个人总结
- CDOJ 1304 Infinity Set