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

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

  •  
  •   yuandj Nov 10, 2020 3950 views
    This topic created in 2014 days ago, the information mentioned may be changed or developed.

    运行环境

    • 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 左右时,从监控平台查看,遇到了服务器响应时间过长的问题;修改为原始语法后,恢复正常,哪位大佬能解答一下原因呢?

    Supplement 1    Nov 10, 2020
    请不要拘谨于语法性能层面,或许是语法逻辑问题
    Supplement 2    Nov 11, 2020

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

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

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

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

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


    https://www.qs5.org/Post/637.html
    lijialong1313
        4
    lijialong1313  
       Nov 10, 2020
    如果需要,你试一下降低一个 php 版本( 7.3.24 应该是)看看会不会
    jhdxr
        5
    jhdxr  
       Nov 10, 2020
    这两句解析后没有区别,去看看别的地方吧
    dilu
        6
    dilu  
       Nov 10, 2020
    这个问题有点意思,我先研究研究看
    ben1024
        7
    ben1024  
       Nov 10, 2020
    脱离框架原生运行是否这样呢
    NCE
        8
    NCE  
       Nov 10, 2020
    粗略看应该出在$cAd 这个对象很大,TPS 多的情况下对内存开销有影响。
    felix021
        9
    felix021  
       Nov 11, 2020
    用 vld 生成 opcode 看看吧,估计没啥区别,猜测问题在其他地方,或者实际的代码情况比截出来的复杂。
    lovecy
        10
    lovecy  
       Nov 11, 2020
    你就这几行,能有啥逻辑问题?
    而且这种简写是完全要避免的,后面维护很容易出问题
    非要说是逻辑问题,肯定是简写导致了后面的代码没有包括到 if 块里面,检查下吧
    About     Help     Advertise     Blog     API     FAQ     Solana     916 Online   Highest 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 47ms UTC 18:59 PVG 02:59 LAX 11:59 JFK 14:59
    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