关于不同的 PHP 语法在并发时的性能问题请教 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
yuandj
V2EX    PHP

关于不同的 PHP 语法在并发时的性能问题请教

  •  
  •   yuandj 2020-11-10 14:20:10 +08:00 3635 次点击
    这是一个创建于 1810 天前的主题,其中的信息可能已经有所发展或是发生改变。

    运行环境

    • php 版本:php7.4.3
    • 程序框架:hyperf 2.0
    • swoole 版本:4.5.1

    代码示例

    // 简写语法 1 if (!empty($res['ad'])) $res['ad']['feed_position'] = $config->feed_position ?? null; // 原始语法 1 if (!empty($res['ad'])) { $res['ad']['feed_position'] = $config->feed_position ?? null; } // 简写语法 2 if (!empty($cAd['dspResponse'])) $bid['dspResponse'][] = $cAd['dspResponse']; // 原始语法 2 if (!empty($cAd['dspResponse'])) { $bid['dspResponse'][] = $cAd['dspResponse']; } 

    问题:

    上面两种不同的语法,简写语法:在 QPS 750~1100 左右时,从监控平台查看,遇到了服务器响应时间过长的问题;修改为原始语法后,恢复正常,哪位大佬能解答一下原因呢?

    第 1 条附言    2020-11-10 14:55:28 +08:00
    请不要拘谨于语法性能层面,或许是语法逻辑问题
    第 2 条附言    2020-11-11 17:41:14 +08:00

    初步排除语法引起的问题。

    1. 当时部署时正好是个整点时间,回滚回去之后,每到整点也会有一波响应时间过长的问题(响应时间在2秒左右,并发量激增导致的);后来修改了swoole的woker个数得到了改善(改前是worker_num = cpu核心数2,改后是 woker_num = cpu核心数1)。 PS: 之前第一次遇到响应超时也是通过减少woker个数得到改善。

    2. 在调整语法来测试性能之前,已经做过一个“变量未提前声明”的修复(日志有很多notice);在做“变量未提前声明”修复之前,响应处理时间高达10秒(nginx超时时间为10秒),做完“变量未提前声明”的修复之后(此时语法已是简写),部署时赶在了整点,在监控平台看到响应时间上涨时,及时做了回滚处理,导致响应时间最高是2秒(回滚之后每到整点时,也会有一波相应时间到2秒的现象,如果不回滚,可能到2秒之后也不会再上涨;如果上述说法成立,那就说明高达10秒的响应延迟可能是“变量未提前声明”导致的),后面又做了“语法修复”,部署时错开了高峰期,导致部署后并没有出现响应时间过长的问题。但之后每到整点,还是会有一波响应时间在2秒左右的现象,后来通过修改woker个数得到解决。

    10 条回复    2020-11-11 14:30:14 +08:00
    puzzle9
        1
    puzzle9  
       2020-11-10 14:36:31 +08:00
    不是 主要是你这代码 这么看了半天
    你直接赋值不好吗 为啊哈还要判断下
    dd112389
        2
    dd112389  
       2020-11-10 14:36:39 +08:00
    这是只少了个大括号 ?
    没有遇到过.
    imdong
        3
    imdong  
       2020-11-10 15:07:36 +08:00 via iPhone
    这种语法应该只在解析时有区别,执行应该没有区别。

    AST 无法解析有可能会少一层 Block ?

    不过讲真,这种语法上的性能差距(假设有),应该也是亿次执行才能被感觉到的差。

    之前研究过 if ($a == false) 与 if (!$a) 的性能差异,事实是有,但太小,完全可以忽略不计


    https://www.qs5.org/Post/637.html
    lijialong1313
        4
    lijialong1313  
       2020-11-10 15:08:15 +08:00
    如果需要,你试一下降低一个 php 版本( 7.3.24 应该是)看看会不会
    jhdxr
        5
    jhdxr  
       2020-11-10 18:59:15 +08:00
    这两句解析后没有区别,去看看别的地方吧
    dilu
        6
    dilu  
       2020-11-10 19:15:27 +08:00
    这个问题有点意思,我先研究研究看
    ben1024
        7
    ben1024  
       2020-11-10 19:16:47 +08:00
    脱离框架原生运行是否这样呢
    NCE
        8
    NCE  
       2020-11-10 19:48:50 +08:00
    粗略看应该出在$cAd 这个对象很大,TPS 多的情况下对内存开销有影响。
    felix021
        9
    felix021  
       2020-11-11 00:18:27 +08:00
    用 vld 生成 opcode 看看吧,估计没啥区别,猜测问题在其他地方,或者实际的代码情况比截出来的复杂。
    lovecy
        10
    lovecy  
       2020-11-11 14:30:14 +08:00
    你就这几行,能有啥逻辑问题?
    而且这种简写是完全要避免的,后面维护很容易出问题
    非要说是逻辑问题,肯定是简写导致了后面的代码没有包括到 if 块里面,检查下吧
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2574 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 27ms UTC 03:02 PVG 11:02 LAX 20:02 JFK 23:02
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86