PHP

PHP7

PHP7性能

Posted by Bug1024 on December 16, 2017

新特性

  • 标量类型声明 字符串(string), 整数 (int), 浮点数 (float), 以及布尔值 (bool)。它们扩充了PHP5中引入的其他类型:类名,接口,数组和 回调类型
  • 返回值类型声明 类似于参数类型声明,返回类型声明指明了函数返回值的类型
  • null合并运算符 考虑到日常使用到大量三元表达式和isset()的情况,添加了null合并运算符??这个语法糖。如果变量存在且值不为NULL, 它就会返回自身的值,否则返回它的第二个操作数
  • 太空船操作符(组合比较符) <=>用于比较两个表达式。当$a小于、等于或大于$b时它分别返回-1、0或1
  • 通过define()定义常量数组 Array 类型的常量现在可以通过define() 来定义。在PHP5.6中仅能通过const定义
  • 匿名类 现在支持通过new class 来实例化一个匿名类,这可以用来替代一些“用后即焚”的完整类定义

高性能

PHP7是一个比较底层升级,比起PHP5的变化比较大,通过减少内存分配次数,多使用栈内存,缓存数组hash值,字符串解析成参数改为宏展开,使用大块连续内存代替小块碎片内存等等,使得性能有很大提升,具体就性能优化层面,大致可以汇总如下:

  • 将基础变量从struct(结构体)变为union(联合体),节省内存空间,间接减少CPU在内存分配和管理上的开销。
  • 部分基础变量(zend_array、zend_string等)采用内存空间连续分配的方式,降低CPU Cache Miss的发生的概率。CPU从CPU Cache获取数据和从内存获取,它们之间效率相差可以高达100倍。举一个近似的例子,系统从内存读取数据和从磁盘读取数据的效率差别很大,CPU Cache Miss类似遇到缺页中断。
  • 通过宏定义和内联函数(inline),让编译器提前完成部分工作。无需在程序运行时分配内存,能够实现类似函数的功能,却没有函数调用的压栈、弹栈开销,效率会比较高。

参考