Smarty3的性能问题

前篇文章中主要介绍了使用smarty3下的开发规范以及从smarty2迁移到smarty3中要注意的问题。

虽然刚出来的时候官方对性能这块给出的结果是smarty3的性能相比smarty2要好很多,但最近在实际项目使用中发现了性能方面是有很大问题的。下面通过一个具体的实例案例分析。

实际案例

由于之前使用的是smarty2,最近在向smarty3迁移的过程中,一些不重要的页面上线后运行的一直很良好。在迁移最后的一个模块后(访问量很大),上线后直接导致页面挂了,并且CPU的占有率始终是100%,只好回滚了。但在线下并不能复现挂了的情况,后来定位到可能是性能的问题,相关的QA同学进行压力测试时,证明了这一猜测。在并发量很高的情况下,线下也能复线CPU占用100%,页面挂了的情况。

事后对这个模块进行了详细的分析,以及和smarty2的对比,下面是具体的对比结果。

上图的数据是个导致页面挂了的极端情况,虽然其他页面数据上反差不会这么大,但确实反应了Smarty3有性能问题。

具体分析

从上面的图表中,使用smarty2开发的文件大小为34K。由于Smarty3里使用了模版继承(inc_layout.html 1.8K)和自定义函数(inc_util.html 25K),并且自定义函数是整个模块的,所以Smarty3的开发文件大小相对要比Smarty2大一些。

但编译后Smarty2的文件大小只有52K,Smarty3编译后确有200,我们看下到底是哪些东西导致了Smarty3编译后有那么大。

这是编译后文件依赖的代码片段,其中用了200行的代码维护了文件依赖。

只是自定义函数参数的管理代码片段,用了370行的代码进行了自定义函数参数的维护。

这时自定义函数实体的代码片段,用了1000行的代码进行自定义函数实体的维护。

还有大量使用了__set,__get等魔术方法,这些直接导致文件体积很大的原因。

性能损耗点

通过以上分析,可以大致确定影响性能有一下几个方面:

1、文件依赖管理

2、自定义函数参数管理

3、自定义函数实体代码管理(直接编译成php函数,太二了。不过跨模块的方式貌似也没其他比较好的办法)

4、过量使用了类、__set、__get等魔术方法

如何优化

既然smarty3有这么严重的性能问题,如果使用的话就要对它进行优化。下面介绍一些优化方法,主要是开发 的时候还是用smarty3的那些优秀特性,这样可以大大提高开发效率和维护成本。在代码上线之前进行编译,将影响性能的那些方式优化系统原生的方式,如:

1、优化文件依赖。如果引用本模块的文件,可以直接读取文件内容替换过去,减少文件依赖和IO开销。

2、自定义函数。如果是本模块的自定义函数并且其他模块不会引用(非通用模块一般都不会被其他模块引用),可以直接将自定义函数的主题替换过去,减少自定义函数参数管理和编译成PHP函数。

3、优化一些魔术方法,将一些魔术方式直接编译后数据的调用。

4、可以考虑在编译的时候把文件编译好,对编译后的文件将进行优化。

近期会进行smarty3优化的开发,开发完成后会细谈优化这块。

loading...
通过 为知笔记 发布

转载于:https://www.cnblogs.com/firmy/archive/2012/09/26/2703995.html

Smarty3的性能问题相关推荐

  1. smarty2和smarty3

    参考:http://hi.baidu.com/audislee/blog/item/930a101bb4fa3b098618bfb1.html Smarty 3 API 的语法结构已经重构,使之更一致 ...

  2. kali2020进入单模式_蚂蚁集团技术专家山丘:性能优化的常见模式及趋势

    陈显铭(山丘) 读完需要 6分钟 速读仅需 2 分钟 陈显铭,花名山丘,就职于蚂蚁集团,对分布式应用架构.服务化.性能优化等有深入的理解.参与支付宝支付链路核心系统,设计.调优应用系统关键能力, 高效 ...

  3. Go 学习笔记(81)— Go 性能分析工具 pprof

    Go 语言工具链中的 go pprof 可以帮助开发者快速分析及定位各种性能问题,如 CPU消耗 .内存分配及阻塞分析 .具体作用如下: 性能分析首先需要使用 runtime.pprof 包嵌入到待分 ...

  4. pyspark性能调优参数

    20220311 参数调节 把executor数量调小,其他参数值调大,不容易报错 一.指定spark executor 数量的公式 executor 数量 = spark.cores.max/spa ...

  5. 矩阵乘法的性能提升 AutoKernel

    随着AI技术的快速发展,深度学习在各个领域得到了广泛应用.深度学习模型能否成功在终端落地应用,满足产品需求,一个关键的指标就是神经网络模型的推理性能.于是,一大波算法工程师为了算法的部署转岗算子优化工 ...

  6. TensorFlow与PyTorch模型部署性能比较

    TensorFlow与PyTorch模型部署性能比较 前言 2022了,选 PyTorch 还是 TensorFlow?之前有一种说法:TensorFlow 适合业界,PyTorch 适合学界.这种说 ...

  7. App性能分析数据监控

    App性能分析数据监控 APP的性能监控包括: CPU 占用率.内存使用情况.网络状况监控.启动时闪退.卡顿.FPS.使用时崩溃.耗电量监控.流量监控等等. 文中所有代码都已同步到github中,有兴 ...

  8. Yolo v4, v3 and v2 性能极简图示

    Yolo v4, v3 and v2 性能图示 https://github.com/AlexeyAB/darknet 参考链接: https://github.com/AlexeyAB/darkne ...

  9. Arm Cortex-M4 MCU性能

    Arm Cortex-M4 MCU性能 基于ARM Cortex-M和RISC-V内核,提供了丰富的产品组合和全面的软硬件支持. Arm Cortex-M4 MCU 基于Arm® Cortex®-M4 ...

  10. Arm Cortex-M3 MCU性能

    Arm Cortex-M3 MCU性能 基于ARM Cortex-M和RISC-V内核,研发出来了产品组合和全面的软硬件支持. Arm Cortex-M3 MCU 基于Arm® Cortex®-M3内 ...

最新文章

  1. 亚洲首获奖!清华大学团队获ACM SIGCOMM 2021唯一最佳学生论文奖
  2. Linux wget 命令详解
  3. php文件上传代码_PHP实现文件分片上传的实例代码
  4. 华为服务器显示红色的心跳,服务器心跳检查
  5. qt ui界面加入qsplitter_UI 文件设计与运行机制
  6. silverlight导出excel
  7. JDK源码解析之 java.lang.Integer
  8. 手机MODEM开发( 25)---如何配置VoLTE, ViLTE and VoWifi(IMS config for VoLTE, ViLTE and VoWifi)
  9. web.xml中配置DispatcherServlet前端控制器和CharacterEncodingFilter字符过滤器后web-app标签显红报错
  10. poj3083Children of the Candy Corn(dfs+bfs)
  11. Javascript特效:封装元素动画函数
  12. 通过telegram 传递变量_Docker随时随地玩转变量
  13. SpringCloud实战微服务之——Ribbon详解
  14. 【保姆级教程】VMware+CentOS 7 配置静态IP(小名已排雷,放心跟着教程走)
  15. javascript从入门到跑路-----小文的js学习笔记(6)-----三大流程控制语句---顺序控制、分支控制、循环控制
  16. java locale 中国_Java描述语言、国家和地理的类——Locale
  17. win7纯净版安装mysql_win7旗舰版64位安装mysql
  18. 群论:群的定义与阿贝尔群
  19. 主动变被动9个例句_【语法】被动语态的特殊用法考点总结
  20. CSTC 部分pwn wp

热门文章

  1. LeCun、Bengio和Hinton综述论文《deep learning》
  2. 在jupyter上绘制caffe网络迭代时的损失和精度曲线
  3. 用PyTorch实现一个卷积神经网络进行图像分类
  4. java和python互相调用
  5. 有的时候print函数不会立即打印的解决办法(flush=True)
  6. 剑指offer答案python_剑指offer(python)(未完)
  7. Solana 海湾流(Gulf Stream)海平面(Sealevel)区别
  8. cactiez mysql_cactiez v11添加对mysql数据库、apache系统进行监控
  9. dell服务器怎么用u盘系统安装win7系统教程,戴尔DellU盘重装系统操作教程
  10. mysql innodb 浅读