Zend JIT 即时编译器开源

oschina
 oschina
发布于 2015年03月01日
收藏 25

Zend 宣布 Zend JIT 开源,源码地址:

https://github.com/zendtech/php-src/tree/zend-jit/ext/opcache/jit

该分支包含 PHP JIT 的 PoC 概念实现,JIT 是 OPCache 的部分实现,不要求对 PHP 引擎进行任何修改,设计时 100% 兼容。JIT 使用 LLVM 后端,在 x86 和 x86_64 平台下测试通过。目前该项目还在体验阶段。

构建

PHP 可通过如下参数进行配置和构建。LLVM 代码不稳定,因此版本间可能会有一些不兼容的问题。建议使用 LLVM 3.5 来避免兼容性问题。

  • --enable-jit

  • --with-llvm=/usr/local/llvm-3.5'

  • --with-valgrind

  • --with-oprofile

配置

为了启用 JIT 需要在 opcache ini 指令增加新行:

  • opcache.jit_buffer_size=32M

性能

JIT 提供超过 5 倍的性能提升,一些如 Mandelbrot 的性能提升 30 倍

TestJIT offJIT on
simple0.0300.004
simplecall0.0130.000
simpleucall0.0400.008
simpleudcall0.0410.008
mandel0.2100.007
mandel20.2800.009
ackermann(7)0.0620.014
ary(50000)0.0060.003
ary2(50000)0.0050.003
ary3(2000)0.0880.027
fibo(30)0.1260.037
hash1(50000)0.0170.012
hash2(500)0.0170.010
heapsort(20000)0.0530.018
matrix(20)0.0550.024
nestedloop(12)0.0590.010
sieve(30)0.0390.007
strcat(200000)0.0080.004
Total1.1470.206

不幸的是 JIT 并没有提升真实应用的性能,同时 LLVM 编译时间也不适合运行时代码生成的。

本站文章除注明转载外,均为本站原创或编译。欢迎任何形式的转载,但请务必注明出处,尊重他人劳动共创开源社区。
转载请注明:文章转载自 开源中国社区 [http://www.oschina.net]
本文标题:Zend JIT 即时编译器开源
加载中

最新评论(24

甘薯
甘薯

引用来自“eechen”的评论

上面提到的auto_prepend_file的用法有误,因为auto_prepend_file会在每个PHP文档前添加,每个请求都生成一个OPcache缓存显然是错误的。其实一个请求会设计到多个PHP文件,由PHP自己生成会更简单。

引用来自“咚往咚来”的评论

目前我遇到了php密集型计算的问题,4核8G内存,竟然把腾讯云的一台机器跑到挂了。如果是php7,现阶段的php7能对这种情况有所改善或缓解吗?

引用来自“eechen”的评论

ZendOpcache只在php-fpm(fpm-fcgi),php-cgi(cgi-fcgi),libphp5.so(apache2handler)这些Web应用上生效.
首先在这些Web响应的场合使用动态弱类型脚本语言做密集型计算本身就是不合理的.还有,不知道你是怎么定位到是由ZendOpcache引起的,错误日志里提示了什么.

引用来自“咚往咚来”的评论

错误是腾讯云报的,out of memory,而且无法主动kill掉php进程,所以挂掉了。运算密集型的场景,还只能适用于php-fpm,直接用php这个二进制问看用作后台处理不行?
你其实可以先尝试一下把内存限制增大, 内存溢出未必是计算密集性的缺陷造成的, 计算密集主要是在CPU运算方面的劣势而不太可能造成内存溢出, 你的php程序如果变量太多而且无法回收那其他语言估计也顶不住, 你先增大内存看看能否解决, 如果不行的话你只能优化你的程序, 把逻辑分散成多个函数或者进程, 让变量及时回收减少内存溢出的可能性.
eechen
eechen

引用来自“eechen”的评论

上面提到的auto_prepend_file的用法有误,因为auto_prepend_file会在每个PHP文档前添加,每个请求都生成一个OPcache缓存显然是错误的。其实一个请求会设计到多个PHP文件,由PHP自己生成会更简单。

引用来自“咚往咚来”的评论

目前我遇到了php密集型计算的问题,4核8G内存,竟然把腾讯云的一台机器跑到挂了。如果是php7,现阶段的php7能对这种情况有所改善或缓解吗?

引用来自“eechen”的评论

ZendOpcache只在php-fpm(fpm-fcgi),php-cgi(cgi-fcgi),libphp5.so(apache2handler)这些Web应用上生效.
首先在这些Web响应的场合使用动态弱类型脚本语言做密集型计算本身就是不合理的.还有,不知道你是怎么定位到是由ZendOpcache引起的,错误日志里提示了什么.

引用来自“咚往咚来”的评论

错误是腾讯云报的,out of memory,而且无法主动kill掉php进程,所以挂掉了。运算密集型的场景,还只能适用于php-fpm,直接用php这个二进制问看用作后台处理不行?
php在cli下执行的脚本是不会触发ZendOpcache缓存的,也就是说ZendOpcache在cli下是无效的,我估计是你php.ini里配置的memory_limit太小了.
咚往咚来
咚往咚来

引用来自“eechen”的评论

上面提到的auto_prepend_file的用法有误,因为auto_prepend_file会在每个PHP文档前添加,每个请求都生成一个OPcache缓存显然是错误的。其实一个请求会设计到多个PHP文件,由PHP自己生成会更简单。

引用来自“咚往咚来”的评论

目前我遇到了php密集型计算的问题,4核8G内存,竟然把腾讯云的一台机器跑到挂了。如果是php7,现阶段的php7能对这种情况有所改善或缓解吗?

引用来自“eechen”的评论

ZendOpcache只在php-fpm(fpm-fcgi),php-cgi(cgi-fcgi),libphp5.so(apache2handler)这些Web应用上生效.
首先在这些Web响应的场合使用动态弱类型脚本语言做密集型计算本身就是不合理的.还有,不知道你是怎么定位到是由ZendOpcache引起的,错误日志里提示了什么.
错误是腾讯云报的,out of memory,而且无法主动kill掉php进程,所以挂掉了。运算密集型的场景,还只能适用于php-fpm,直接用php这个二进制问看用作后台处理不行?
咚往咚来
咚往咚来

引用来自“eechen”的评论

上面提到的auto_prepend_file的用法有误,因为auto_prepend_file会在每个PHP文档前添加,每个请求都生成一个OPcache缓存显然是错误的。其实一个请求会设计到多个PHP文件,由PHP自己生成会更简单。

引用来自“咚往咚来”的评论

目前我遇到了php密集型计算的问题,4核8G内存,竟然把腾讯云的一台机器跑到挂了。如果是php7,现阶段的php7能对这种情况有所改善或缓解吗?

引用来自“甘薯”的评论

这种情况建议同时并存java等密集计算优化有很大优势的语言.把相关的逻辑改成java的用虚拟机运行.php有一些先天不足, 我也正在头疼. 比如定时任务就是麻烦.
目前我是正在看go语言,看是否可以解决。php这块儿确实不行
甘薯
甘薯

引用来自“eechen”的评论

上面提到的auto_prepend_file的用法有误,因为auto_prepend_file会在每个PHP文档前添加,每个请求都生成一个OPcache缓存显然是错误的。其实一个请求会设计到多个PHP文件,由PHP自己生成会更简单。

引用来自“咚往咚来”的评论

目前我遇到了php密集型计算的问题,4核8G内存,竟然把腾讯云的一台机器跑到挂了。如果是php7,现阶段的php7能对这种情况有所改善或缓解吗?
这种情况建议同时并存java等密集计算优化有很大优势的语言.把相关的逻辑改成java的用虚拟机运行.php有一些先天不足, 我也正在头疼. 比如定时任务就是麻烦.
eechen
eechen

引用来自“eechen”的评论

上面提到的auto_prepend_file的用法有误,因为auto_prepend_file会在每个PHP文档前添加,每个请求都生成一个OPcache缓存显然是错误的。其实一个请求会设计到多个PHP文件,由PHP自己生成会更简单。

引用来自“咚往咚来”的评论

目前我遇到了php密集型计算的问题,4核8G内存,竟然把腾讯云的一台机器跑到挂了。如果是php7,现阶段的php7能对这种情况有所改善或缓解吗?
ZendOpcache只在php-fpm(fpm-fcgi),php-cgi(cgi-fcgi),libphp5.so(apache2handler)这些Web应用上生效.
首先在这些Web响应的场合使用动态弱类型脚本语言做密集型计算本身就是不合理的.还有,不知道你是怎么定位到是由ZendOpcache引起的,错误日志里提示了什么.
理工小强
理工小强

引用来自“理工小强”的评论

很大程度上这都不是事 硬件公司加把劲就可以了

引用来自“甘薯”的评论

硬件公司已经很给力了.
不过任何东西都有极限,
软件上如果能优化一点, 带来的进步和效益比硬件提升更可观和经济.
嗯 编程语言的易用性直接会增加生产力 对于创业型公司 快速出来产品比性能更重要 ~~
咚往咚来
咚往咚来

引用来自“eechen”的评论

上面提到的auto_prepend_file的用法有误,因为auto_prepend_file会在每个PHP文档前添加,每个请求都生成一个OPcache缓存显然是错误的。其实一个请求会设计到多个PHP文件,由PHP自己生成会更简单。
目前我遇到了php密集型计算的问题,4核8G内存,竟然把腾讯云的一台机器跑到挂了。如果是php7,现阶段的php7能对这种情况有所改善或缓解吗?
甘薯
甘薯

引用来自“理工小强”的评论

很大程度上这都不是事 硬件公司加把劲就可以了
硬件公司已经很给力了.
不过任何东西都有极限,
软件上如果能优化一点, 带来的进步和效益比硬件提升更可观和经济.
甘薯
甘薯

引用来自“eechen”的评论

动态弱类型语言在运行时才会确定变量类型,所以是不利于进行JIT优化的,而JIT即时编译在做计算密集型应用时有优势,Facebook为HHVM增加的Hack语言支持就是为了更好的JIT优化。也就是说动态弱类型语言包括PHP都不适合用来做计算密集型应用,而大多数Web应用都是I/O密集型应用,更多的时间都是花在数据库查询、网络传输上面。

也许正是对JIT的概念验证没有达到PHP开发组的预期,所以PHP7中鸟哥把性能提升的方向转到内存上,比如采用更好的内存结构,减少内存分配循环等,从而减少CPU指令数。所以在真实PHP应用的测试中,没有JIT支持的PHP7的性能也是跟带有JIT的HHVM旗鼓相当的:
PHPNG在WordPress测试中,指令数从9,413,106,833减少到2,899,707,051,时间从26秒减少到12秒,性能提升超过1倍:
https://wiki.php.net/phpng
http://static.oschina.net/uploads/space/2015/0106/145823_LBQW_561214.png
说的没错.很多用其他语言尤其是java搞web开发很鄙视phper令人感觉到很无语.
返回顶部
顶部