shopex在优化php语法解释损耗的一些实践
时间:2009-12-03
来源:互联网
我们在性能分析shopex性能的时候。
发现用在php的语法解析上的损耗占了很大比重
如果用valgrind看他的C调用的话,就会发现大约50%的时间被用在lex&yacc上面。
也就是由php代码转成opcode的部分。即php的代码解释损耗。
这个方面性能的优化极限目标是: 一个访问只运行一个php文件,并且这个文件里不包含任何与这个流程无关的代码。
如何兼顾代码结构容易理解和性能是个挑战
我们的处理思路是,通过类似smarty的编译系统,将访问编译成一个个文件:因为shopex是mvc的结构,那么编译粒度就每个控制器的方法对应一个流程文件。
当控制器第一次调用时,通过一种方法监控流经的每个model-method,子过程等等,最后抽取剥离出来,加上公用的数据库连接函数,配置文件等等一起组合成一个单一的终极php文件。
至于缓存的更新基本就是版本的更新,每次升级的时候。touch一个cachestat文件的最后修改时间即可。
那么实现的挑战有两个:
上面两条最新的shopex485已经走了很远了,商品和订单的函数都已经拆分了。
第二个我们自己实现了一个叫tramsy的解析器( 翻转(smart)+y ),特点是把大量的插件改成了编译型。
强化了编译插件的特性,增加了一种编译型modifier的插件类型。并且提出了变量预绑定的概念:
这个设计大约减少了一倍多的编译结果。性能提升了大约20%左右
http://live.shopex.cn/archives/315
发现用在php的语法解析上的损耗占了很大比重
如果用valgrind看他的C调用的话,就会发现大约50%的时间被用在lex&yacc上面。
也就是由php代码转成opcode的部分。即php的代码解释损耗。
这个方面性能的优化极限目标是: 一个访问只运行一个php文件,并且这个文件里不包含任何与这个流程无关的代码。
如何兼顾代码结构容易理解和性能是个挑战
我们的处理思路是,通过类似smarty的编译系统,将访问编译成一个个文件:因为shopex是mvc的结构,那么编译粒度就每个控制器的方法对应一个流程文件。
当控制器第一次调用时,通过一种方法监控流经的每个model-method,子过程等等,最后抽取剥离出来,加上公用的数据库连接函数,配置文件等等一起组合成一个单一的终极php文件。
至于缓存的更新基本就是版本的更新,每次升级的时候。touch一个cachestat文件的最后修改时间即可。
那么实现的挑战有两个:
- 一个叫model的函数化 (这样叫很酷,有点像虚的死神化) 。是弱化model层对象特性,让类退化为仅是函数的容器,减少继承,重载这些应用。
- 二是实现一个自己的编译引擎。
上面两条最新的shopex485已经走了很远了,商品和订单的函数都已经拆分了。
第二个我们自己实现了一个叫tramsy的解析器( 翻转(smart)+y ),特点是把大量的插件改成了编译型。
强化了编译插件的特性,增加了一种编译型modifier的插件类型。并且提出了变量预绑定的概念:
{if $var=1} <div>yes</div> {elseif $var=2} <div>no</div> {else} <div>what?</div> {/if}如果是原生的smarty,生成的代码是:
<?php if($smarty->vars['var']==1){ ?> <div>yes</div> <?php {elseif($smarty->vars['var']==2){ ?> <div>no</div> <?php }else{ ?> <div>what?</div> <?php } ?>如果在tramsy里,程序员预测var一定是1,并且有把握在其值改变的时候系统自动清除模板缓存,就可以把他设置为"预绑定变量" 那么最终生成的代码就是:
<div>yes</div>如果if的一个分支里面东西很多,那这个提升就非常显著
这个设计大约减少了一倍多的编译结果。性能提升了大约20%左右
http://live.shopex.cn/archives/315
作者: flaboy 发布时间: 2009-12-03
有点高深。。。。。
作者: syw0602 发布时间: 2009-12-21
虚的死神化
这个比喻NB~~~ 作者: kakashilw 发布时间: 2009-12-21
回复 flaboy
看的晕啊晕
看的晕啊晕
作者: 315224416 发布时间: 2009-12-22
相关阅读 更多
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28