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

2020-11-10 14:20:10 +08:00
 yuandj

运行环境

代码示例

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

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

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

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

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


https://www.qs5.org/Post/637.html
lijialong1313
2020-11-10 15:08:15 +08:00
如果需要,你试一下降低一个 php 版本( 7.3.24 应该是)看看会不会
jhdxr
2020-11-10 18:59:15 +08:00
这两句解析后没有区别,去看看别的地方吧
dilu
2020-11-10 19:15:27 +08:00
这个问题有点意思,我先研究研究看
ben1024
2020-11-10 19:16:47 +08:00
脱离框架原生运行是否这样呢
NCE
2020-11-10 19:48:50 +08:00
粗略看应该出在$cAd 这个对象很大,TPS 多的情况下对内存开销有影响。
felix021
2020-11-11 00:18:27 +08:00
用 vld 生成 opcode 看看吧,估计没啥区别,猜测问题在其他地方,或者实际的代码情况比截出来的复杂。
lovecy
2020-11-11 14:30:14 +08:00
你就这几行,能有啥逻辑问题?
而且这种简写是完全要避免的,后面维护很容易出问题
非要说是逻辑问题,肯定是简写导致了后面的代码没有包括到 if 块里面,检查下吧

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/723588

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX