• 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这种解释型语言中,多一行代码就意味着多执行一段程序。

  • 相关阅读:
    Spring Security 4
    JPA查询
    改进的冒泡算法
    Create User
    COM调用 – VB、PB
    J-Link clone问题
    修复山寨版的J-Link
    C# Web版报表
    HTML/CSS/Javascript代码在线压缩、格式化(美化)工具
    eclipse中字母大小写转换快捷键
  • 原文地址:https://www.cnblogs.com/hxdoit/p/4245090.html
Copyright © 2020-2023  润新知