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

  • boke112导航说道:

    博主,你好,boke112导航(博客导航站)特来拜会,发现贵站不错,已将贵站收录到博客导航的建站技术类,如有异议请留言哦!谢谢!PS:由于找不到贵站的留言板,所以就在此留言告知了,如造成困扰可删除本条评论,谢谢!

  • web前后端技术学习说道:

    很不错的网站,同道中人。必须支持。网站已收藏。以后会常来。也欢迎博主互访互评,一起学习,一起交流,一起成长。没看到可点广告,不然可以帮忙点点广告。

  • 我亦逍遥说道:

    真心的在我的网站到你的网站第一次是跳不过来的!要刷新一下才能显示

Comments are closed. Would you like to contact the author directly?
网站地图|XML地图

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