V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
yuandj
V2EX  ›  PHP

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

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

    运行环境

    • 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   ·   实用小工具   ·   901 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 21:44 · PVG 05:44 · LAX 13:44 · JFK 16:44
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.