// 简写语法 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 左右时,从监控平台查看,遇到了服务器响应时间过长的问题;修改为原始语法后,恢复正常,哪位大佬能解答一下原因呢?
当时部署时正好是个整点时间,回滚回去之后,每到整点也会有一波响应时间过长的问题(响应时间在2秒左右,并发量激增导致的);后来修改了swoole的woker个数得到了改善(改前是worker_num = cpu核心数2,改后是 woker_num = cpu核心数1)。 PS: 之前第一次遇到响应超时也是通过减少woker个数得到改善。
在调整语法来测试性能之前,已经做过一个“变量未提前声明”的修复(日志有很多notice);在做“变量未提前声明”修复之前,响应处理时间高达10秒(nginx超时时间为10秒),做完“变量未提前声明”的修复之后(此时语法已是简写),部署时赶在了整点,在监控平台看到响应时间上涨时,及时做了回滚处理,导致响应时间最高是2秒(回滚之后每到整点时,也会有一波相应时间到2秒的现象,如果不回滚,可能到2秒之后也不会再上涨;如果上述说法成立,那就说明高达10秒的响应延迟可能是“变量未提前声明”导致的),后面又做了“语法修复”,部署时错开了高峰期,导致部署后并没有出现响应时间过长的问题。但之后每到整点,还是会有一波响应时间在2秒左右的现象,后来通过修改woker个数得到解决。
1
puzzle9 2020-11-10 14:36:31 +08:00
不是 主要是你这代码 这么看了半天
你直接赋值不好吗 为啊哈还要判断下 |
2
dd112389 2020-11-10 14:36:39 +08:00
这是只少了个大括号 ?
没有遇到过. |
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 |
4
lijialong1313 2020-11-10 15:08:15 +08:00
如果需要,你试一下降低一个 php 版本( 7.3.24 应该是)看看会不会
|
5
jhdxr 2020-11-10 18:59:15 +08:00
这两句解析后没有区别,去看看别的地方吧
|
6
dilu 2020-11-10 19:15:27 +08:00
这个问题有点意思,我先研究研究看
|
7
ben1024 2020-11-10 19:16:47 +08:00
脱离框架原生运行是否这样呢
|
8
NCE 2020-11-10 19:48:50 +08:00
粗略看应该出在$cAd 这个对象很大,TPS 多的情况下对内存开销有影响。
|
9
felix021 2020-11-11 00:18:27 +08:00
用 vld 生成 opcode 看看吧,估计没啥区别,猜测问题在其他地方,或者实际的代码情况比截出来的复杂。
|
10
lovecy 2020-11-11 14:30:14 +08:00
你就这几行,能有啥逻辑问题?
而且这种简写是完全要避免的,后面维护很容易出问题 非要说是逻辑问题,肯定是简写导致了后面的代码没有包括到 if 块里面,检查下吧 |