百度有个VUI模块,它负责将所有的广告信息縇染成HTML返回给调用方,它采用的是HHVM,縇染模板用的是smarty,前端服务器用的是nginx。

此前知道,新浪微博以前也用的是smarty,自从鸟哥过去后,将smarty全部换成原生的php模板,因为据说性能提高了不少。

耳听为虚,眼见为实,下面从各方面来分析一下smarty对我们的性能产生多少影响。

先贴下我的实验环境,我对HHVM不太了解,先用官方的PHP进行实验(php-fpm),nginx开了8个进程,php-fpm开了20个进程,23核CPU。

PHP代码分有smarty和无smarty两种,都仅有实验代码,没有用别的框架。代码中的逻辑采用smarty给的demo(一部分),我用原生的PHP重写了一遍。代码可下载

有smarty代码的入口文件为./demo/index.php,没有smarty的入口文件为./demo/nosmarty/index.php

我在代码中加了函数执行时间统计,目的为了获取縇染模板的部分代码执行的时间。

有smarty

用apache的ab命令进行压力测试,并发10个,不算大;同时用sar命令进行cpu利用率的统计。命令如下:

./ab -c  -n  http://cq01-rdqa-dev072.cq01.baidu.com:8008/index.php

sar -u 2 1000 >/tmp/smarty.sar &

cpu利用率每2秒统计一次,获取了71行数据,平均以后,CPU idle = 66.2845%,也就是平均CPU利用率为32.8%

收集到了123463条执行时间日志,平均执行时间为0.0100512秒。

ab命令显示的Requests per second:    698.30 [#/sec] (mean)

无smarty

cpu利用率每2秒统计一次,获取了21行数据,平均以后,CPU idle = 90.9819%,也就是平均CPU利用率为9.1%

收集到了100000条执行时间日志,平均执行时间为0.000179849秒。

ab命令显示的Requests per second:    2326.84 [#/sec] (mean)

结论:在用smarty的情况下,性能退化还是比较明显的,特别是CPU利用率比较高。

PHP原生模板也有很强大的功能,且不用重新学习模板语法,因为它就是PHP语言,所以还具有最高的灵活性。

进一步分析:

我们可以用strace -p PID attach到一个PHP-FPM进程,看看smarty到底多干了些啥。

通过对比,我们可以发现有smarty时,会多出一些系统调用,其中片段如下所示,这种片段有10个左右,目的都是加载smarty的源代码文件。

lstat("/home/users/huangxuan01/smartytest/demo/../libs/Smarty.class.php", {st_mode=S_IFREG|, st_size=, ...}) =
lstat("/home/users/huangxuan01/smartytest/demo/../libs", {st_mode=S_IFDIR|, st_size=, ...}) =
open("/home/users/huangxuan01/smartytest/libs/Smarty.class.php", O_RDONLY) =
fstat(, {st_mode=S_IFREG|, st_size=, ...}) =
fstat(, {st_mode=S_IFREG|, st_size=, ...}) =
fstat(, {st_mode=S_IFREG|, st_size=, ...}) =
mmap(NULL, , PROT_READ, MAP_SHARED, , ) = 0x7fd328401000
mmap(NULL, , PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -, ) = 0x7fd328281000
munmap(0x7fd328401000, ) =
close() =

我们可以继续追一下它加载了哪些smarty文件,共有多少行。

 /home/users/huangxuan01/smartytest/demo/index.php
/home/users/huangxuan01/smartytest/libs/Smarty.class.php
/home/users/huangxuan01/smartytest/libs/sysplugins/smarty_internal_data.php
/home/users/huangxuan01/smartytest/libs/sysplugins/smarty_internal_templatebase.php
/home/users/huangxuan01/smartytest/libs/sysplugins/smarty_internal_template.php
/home/users/huangxuan01/smartytest/libs/sysplugins/smarty_resource.php
/home/users/huangxuan01/smartytest/libs/sysplugins/smarty_internal_resource_file.php
/home/users/huangxuan01/smartytest/libs/sysplugins/smarty_cacheresource.php
/home/users/huangxuan01/smartytest/libs/sysplugins/smarty_internal_cacheresource_file.php
/home/users/huangxuan01/smartytest/demo/templates_c/cd441ef1a05f578db0423976d6763729fd828a51.file.index.tpl.php
/home/users/huangxuan01/smartytest/libs/plugins/modifier.date_format.php
/home/users/huangxuan01/smartytest/libs/plugins/shared.make_timestamp.php
total

发现它多加载了5823行代码,我想这应该就是它性能比较差的原因吧。在PHP这种解释型语言中,多一行代码就意味着多执行一段程序。

smarty对网页性能的影响的更多相关文章

  1. smarty对网页性能的影响--开启opcache

    在上一篇<smarty对网页性能的影响>中,默认没有开启opcache,于是我安装了一下zend opcache扩展,重新实验了一下,结果如下: 有smarty 用apache的ab命令进 ...

  2. 使用performance进行网页性能监控

    由于项目需要, 需要对网页的一些性能进行监控, 接触到了performance, window.performance 提供了一组精确的数据,经过简单的计算就能得出一些网页性能数据, 将这些数据存储为 ...

  3. http网页性能最佳实践

    你愿意为打开一个网页等待多长时间?我一秒也不愿意等.但是事实上大多数网站在响应速度方面都让人失望.现在越来越多的人开始建立自己的网站,博客,你的网页响应速度如何呢?在这篇文章中我们来介绍一下提高网页性 ...

  4. 网页性能测试之WebPageTest

    想知道您的网站,性能怎么样? 很自然,首先得找一个广被认可的测试工具.我们推荐WebPageTest: WebPageTest 它是google 开源项目”make the web faster “的 ...

  5. 高性能JavaScript-JS脚本加载与执行对性能的影响

    在web产品优化准则中,很重要的一条是针对js脚本的加载和执行方式的优化.本篇文章简单描述一下其中的优化准则. 1. 脚本加载优化 1.1 脚本位置对性能的影响 优化页面加载性能的原则之一是将scri ...

  6. JAVA 异常对于性能的影响

    陶炳哲 - MAY 12, 2015 在对OneAPM的客户做技术支持时,我们常常会看到很多客户根本没意识到的异常.在消除了这些异常之后,代码运行速度与以前相比大幅提升.这让我们产生一种猜测,就是在代 ...

  7. HTTP/2 对 Web 性能的影响(下)

    一.前言 我们在 HTTP/2 对 Web 性能的影响(上)已经和大家分享了一些关于 Http2 的二项制帧.多用复路以及 APM 工具等,本文作为姊妹篇,主要从 http2 对 Web 性能的影响. ...

  8. C++ 性能剖析 (四):Inheritance 对性能的影响

    (这个editor今天有毛病,把我的format全搞乱了,抱歉!) Inheritance 是OOP 的一个重要特征.虽然业界有许多同行不喜欢inheritance,但是正确地使用inheritanc ...

  9. css的!important规则对性能有影响吗

    最近在做项目中发现很多CSS代码里面都使用!important去覆盖原有高优先级的样式.按照常理来说,越是灵活的东西,需要做的工作就会更多.所以想当然的认为像!important这样灵活.方便的规则如 ...

随机推荐

  1. 如何解决jenkins中shell脚本明明执行失败却不自行退出,且构建结果仍然显示success的问题??

    首先,需要明确shell命令执行结果$?为0或者非0仅能代表此执行语句是否顺利执行了,例如: 执行语句:adb connect 192.168.XX.XX 执行结果:unable to connect ...

  2. 利用动软代码生成器 自动生成LINQ需要用的数据实体类 (转)

    首先先建立一个模板 名称随意 我起的“生成数据实体.cmt” 代码如下: <#@ template language="c#" HostSpecific="True ...

  3. free 命令解释

    free 命令 buffers and cached 解释 N多人总是询问,当在linux在输入free时内存总数怎么加起来不一样啊,下面我来解释一下free命令的输出. 我们运行free命令时都会看 ...

  4. 【原创】FPGA开发手记(二) VGA接口

    以下内容均以Xilinx的Nexys3作为开发板 1.VGA接口介绍 首先,先看电路图(3*5为例): 标准VGA一共15个接口,但是实际应用的接口信号只用五个:HSYNC,行同步信号:VSYNC,场 ...

  5. WPF——数据绑定及属性改变事件

    一.首先需要封装一下文本框的属性,并且在实体类中添加一个实体类的属性改变函数 public class User : INotifyPropertyChanged //INotifyPropertyC ...

  6. 转自 Good morning 的几句精辟的话

    1.志愿者招募 根据流量平衡方程来构图非常方便,而且简单易懂,以后可能成为做网络流的神法之一 简单记一下流量平衡方程构图法的步骤: a.列出需求不等式 b.通过设置松弛变量,将不等式变成等式 c.两两 ...

  7. Axis2联接WCF(比较完整的版本)

    Axis2联接WCF(比较完整的版本) 分basicHttpBinding和wsHttpBinding两种情况: 一.basicHttpBinding比较简单一点,先来看看它所要求的HTTP包:POS ...

  8. MVC3系列~Html.BeginForm与Ajax.BeginForm

    Html.BeginForm与Ajax.BeginForm都是MVC架构中的表单元素,它们从字面上可以看到区别,即Html.BeginForm是普通的表单提交,而Ajax.BeginForm是支持异步 ...

  9. 如何监听非本地IP

    做HA的时候,如果每个机器上同时需要监听多个IP的同一个端口.那么肯定是需要写死监听的IP和端口.比如在haproxy里面: frontend free bind default_backend te ...

  10. Spring Timer 两种实现

    有两种流行Spring定时器配置:Java的Timer类和OpenSymphony的Quartz.1.Java Timer定时 首先继承java.util.TimerTask类实现run方法 impo ...