6

PHP7.0性能优化-学习笔记2

Posted by 撒得一地 on 2015年9月6日 in PHP笔记

相关推荐:
1.PHP7 NULL 合并运算符
2.PHP7 太空船运算符(组合比较符<=>)
3.PHP7 常量数组
4.PHP7 匿名类
更多:PHP7新特性教程

优化一:zval使用栈内存

在zend引擎和拓展中,经常要创建一个PHP的变量,底层就是一个zval指针。之前的版本都是通过MAKE_STD_ZVAL动态的从堆上分配一个zval内存,然后为这块内存赋值。而PHP7可以直接使用栈内存。

在PHP5中: 

zval *val;MAKE_STD_ZVAL(val);

上面代码的含义是先申请一个zval指针名为val,然后动态创建一个内存并用val这个声明好的指针指向这块内存块。

在PHP7中:

zval val;

上面代码的含义是:在栈上预分配一块内存来存放PHP变量。这样的好处是减少了多次内存分配的管理和操作,因为在php程序中一般会有大量的变量存在。

优化二:zend_string存储hash值,array查询不再需要重复计算hash表中的key

在php中,数组查询用的非常之频繁。在数组查询值的时候,这个key的值每次都要经过一次转换转成hash值,这是要经过复杂的计算过程的。而且,在php底层,不仅在数组这里有使用到hash转换,还包括类的属性和类的函数,都有用到hash转换。因此,cpu就要花费大量的时间去计算hash值。然而,在我们的程序中,比如数组中这些key的值又经常是不变的,但是每次用到都要重复的去计算。

于是,在PHP7中干脆将这个hash值保存起来,避免后面要用到仍然重复去计算。PHP7为字符串单独创建了新类型叫做zend_string,除了char*指针和长度之外,还增加一个hash字段,用于保存字符串的hash值。因此数组键值查找时不需要反复去计算hash值。可以看下定义的结构体代码:

struct _zend_string {
      zend_refcounted gc;
      zend_ulong h;
      size_t len;
      char val[1]
};	

结构体的变量h就是用来存放计算过的hash值。

欢迎转载,转载请注明出处:http://coderschool.cn/296.html

标签:, , ,

上一篇:

下一篇:

相关推荐

6 Comments

发表评论

电子邮件地址不会被公开。 必填项已用*标注

5 + 2 = ?

网站地图|XML地图

Copyright © 2015-2018 技术拉近你我! All rights reserved.
闽ICP备15015576号-1,版权所有©psz.