哪种结构更快?

sup*_*.ws 0 php performance opcode

哪种结构更快:

$a = $b * $c ? $b * $c : 0;  
Run Code Online (Sandbox Code Playgroud)

要么

$i = $b * $c;  
$a = $i ? $i : 0;  
Run Code Online (Sandbox Code Playgroud)

所有变量都是本地变量.

对于多重复制,添加,减法和除法,速度是否不同?

更新:

这里有一些澄清:

  1. 这是一个关于从头开始编写速度优化代码的理论问题.不是"搜索瓶颈".
  2. 我可以自己测量代码速度.但这不是关于使用microtime()的家庭作业的问题.这是一个关于PHP解释器是如何工作的问题(我试图通过自己挖掘谷歌来解决这个问题,但这个问题是不可靠的).
  3. 而且 - 我自己做了测量,有点困惑.$ a,$ b和$ c的不同起始值(零,负,正,整数和浮点的组合)在结构之间产生不同的结果.所以我很困惑.

BoltClock为我提供了有用的信息,但user576875通过发布操作码解码器的链接来完成我的一天!他的答案也包含对我问题的直接回答.谢谢!

Arn*_*anc 10

如果你有PHP 5.3,这会更快:

$a = $b * $c ?: 0; 
Run Code Online (Sandbox Code Playgroud)

这与之相同$a = $b * $c ? $b * $c : 0;,但$a*$b只进行一次测量.此外,它不会像您的第二个解决方案那样执行其他分配.

使用Martinv.Löwis的基准脚本我得到以下时间:

$a = $b * $c ?: 0;               1.07s
$a = $b * $c ? $b * $c : 0;      1.16s
$i = $b * $c; $a = $i ? $i : 0;  1.39s
Run Code Online (Sandbox Code Playgroud)

现在这些是微优化,因此在执行此操作之前,可能有许多方法可以优化代码:)

如果不是这种情况,您可能还想比较生成的PHP OP代码:

1 $a = $b * $c ? $b * $c : 0;:

number of ops:  8
compiled vars:  !0 = $a, !1 = $b, !2 = $c
line     #  op                           fetch          ext  return  operands
-------------------------------------------------------------------------------
   1     0  MUL                                              ~0      !1($b), !2($c)
         1  JMPZ                                                     ~0, ->5
         2  MUL                                              ~1      !1($b), !2($c)
         3  QM_ASSIGN                                        ~2      ~1
         4  JMP                                                      ->6
         5  QM_ASSIGN                                        ~2      0
         6  ASSIGN                                                   !0($a), ~2
         7  RETURN                                                   null
Run Code Online (Sandbox Code Playgroud)

2 $i = $b * $c; $a = $i ? $i : 0;

number of ops:  8
compiled vars:  !0 = $i, !1 = $b, !2 = $c, !3 = $a
line     #  op                           fetch          ext  return  operands
-------------------------------------------------------------------------------
   1     0  MUL                                              ~0      !1($b), !2($c)
         1  ASSIGN                                                   !0($i), ~0
         2  JMPZ                                                     !0($i), ->5
         3  QM_ASSIGN                                        ~2      !0($i)
         4  JMP                                                      ->6
         5  QM_ASSIGN                                        ~2      0
         6  ASSIGN                                                   !3($a), ~2
         7  RETURN                                                   null
Run Code Online (Sandbox Code Playgroud)

3 $a = $b * $c ?: 0;:

number of ops:  5
compiled vars:  !0 = $a, !1 = $b, !2 = $c
line     #  op                           fetch          ext  return  operands
-------------------------------------------------------------------------------
   1     0  MUL                                              ~0      !1($b), !2($c)
         1  ZEND_JMP_SET                                     ~1      ~0
         2  QM_ASSIGN                                        ~1      0
         3  ASSIGN                                                   !0($a), ~1
         4  RETURN                                                   null
Run Code Online (Sandbox Code Playgroud)

这些OP代码清单由VLD扩展生成.