zoukankan      html  css  js  c++  java
  • smarty对网页性能的影响

    百度有个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 10 -n 100000 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|0664, st_size=48423, ...}) = 0
    lstat("/home/users/huangxuan01/smartytest/demo/../libs", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
    open("/home/users/huangxuan01/smartytest/libs/Smarty.class.php", O_RDONLY) = 4
    fstat(4, {st_mode=S_IFREG|0664, st_size=48423, ...}) = 0
    fstat(4, {st_mode=S_IFREG|0664, st_size=48423, ...}) = 0
    fstat(4, {st_mode=S_IFREG|0664, st_size=48423, ...}) = 0
    mmap(NULL, 48423, PROT_READ, MAP_SHARED, 4, 0) = 0x7fd328401000
    mmap(NULL, 266240, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fd328281000
    munmap(0x7fd328401000, 48423)           = 0
    close(4)                                =

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

    23 /home/users/huangxuan01/smartytest/demo/index.php
      1680 /home/users/huangxuan01/smartytest/libs/Smarty.class.php
       576 /home/users/huangxuan01/smartytest/libs/sysplugins/smarty_internal_data.php
       860 /home/users/huangxuan01/smartytest/libs/sysplugins/smarty_internal_templatebase.php
       738 /home/users/huangxuan01/smartytest/libs/sysplugins/smarty_internal_template.php
       912 /home/users/huangxuan01/smartytest/libs/sysplugins/smarty_resource.php
        89 /home/users/huangxuan01/smartytest/libs/sysplugins/smarty_internal_resource_file.php
       442 /home/users/huangxuan01/smartytest/libs/sysplugins/smarty_cacheresource.php
       297 /home/users/huangxuan01/smartytest/libs/sysplugins/smarty_internal_cacheresource_file.php
        98 /home/users/huangxuan01/smartytest/demo/templates_c/cd441ef1a05f578db0423976d6763729fd828a51.file.index.tpl.php
        65 /home/users/huangxuan01/smartytest/libs/plugins/modifier.date_format.php
        43 /home/users/huangxuan01/smartytest/libs/plugins/shared.make_timestamp.php
      5823 total

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

  • 相关阅读:
    我的浏览器收藏夹分类
    我的浏览器收藏夹分类
    Java实现 LeetCode 318 最大单词长度乘积
    Java实现 LeetCode 318 最大单词长度乘积
    Java实现 LeetCode 318 最大单词长度乘积
    Java实现 LeetCode 316 去除重复字母
    Java实现 LeetCode 316 去除重复字母
    Java实现 LeetCode 316 去除重复字母
    Java实现 LeetCode 315 计算右侧小于当前元素的个数
    Java实现 LeetCode 315 计算右侧小于当前元素的个数
  • 原文地址:https://www.cnblogs.com/hxdoit/p/4245090.html
Copyright © 2011-2022 走看看