php5:开发效率快,语言本身性能差
在普通的网站:io密集型,瓶颈在mysql上,体现不出php的性能劣势
然而在密集计算方面,比c/c++/java就差几十甚至几百倍
php7的重点新特性
1.函数的参数增加标量类型限定声明,以前支持对象和数组
函数的返回值增加类型限定声明
//为JIT特性做准备的,让JIT可以准确的判断变量的类型,生成最佳的机器码
2.之前zend引擎发生致命错误会终止程序运行,7可以使用try/catch捕获.
PHP7的性能优化
1. zval使用了栈内存
在zend引擎和扩展中,经常要创建一个php变量,底层就是一个
zval指针
(与symbol_table的变量名有关).之前是通过MAKE_STD_ZVAL动态的从堆上分配
一个zval内存
的,而在php7可以直接使用栈内存
//php5
zval *val; MAKE_STD_ZVAL(val);
//php7
zval val;
//好处:节省了一次内存分配
在PHP程序中也会创建大量的变量,在栈上预分配一块内存来存放(某些变量的)zval
好处:节省了大量内存分配和管理的工作,性能得到了提升
2.zend_string存储hash值,araay查询不再需要重复计算hash
7为字符串单独创建了新的结构体类型`zend_string`
struct _zend_string {
zend_refcounted gc;
zend_ulong h;
size_t len;
char val[1]
}
除了char *指针和长度,增加了一个h存储hash值,数组的键名查找不需要反复计算hash值.
以前,虽然HashTable数据结构的查找时间复杂度是O(1),但是每次键名的字符串都需要hash函数
计算成hash整数,但是实际情况是,php程序运行起来后,key几乎是不变的
所以7中直接的把hash值存储起来,节省大量的cpu计算时间,优化性能
这两项优化就让zend引擎性能得到了大幅度的提升
php5的zval结构体和value类型
3.在hashtable桶内直接存数据,减少了内存的申请次数,提升了cache命中率和内存访问速度(因为几乎在同一个内存页中了)
以前hashtable数据结构存储数据形式的图
简图:
php7中的hashtable桶图
直接就是一大块内存,在内存之上就是一个一个的桶.
这样的好处就是,在php7之前每次有数据插入,都要申请一次内存.而在7中,只需要一次分配一块大内存就行了.
减少了内存申请的次数
4.zend_parse_parameters改为了宏实现,性能提升5%
主要用扩展开发,功能是从php变量到c扩展函数之间交换参数,交换返回值.
7之前,这个函数是c函数实现的:
7之后,用宏实现:
5.增加4中opcode指令
call_user_function,is_init/string/array,strlen,defined函数变成opcode指令,速度更快
6.其他
基础类型int,float,bool等赋值的时候改为直接的值拷贝(之前使用的是php的引用技术,zval有关)
排序算法改进,PCRE withJIT(正则表达式编译成机器码)
了解一下gdb的pgo功能
JIT: