Php 哪种施工速度更快?

Php 哪种施工速度更快?,php,performance,opcode,Php,Performance,Opcode,哪种施工速度更快: $a = $b * $c ? $b * $c : 0; $a = $b * $c ?: 0; 或 所有变量都是局部变量 乘法、加法、减法和除法的速度不同吗 更新: 以下是一些澄清: 这是一个关于从头开始编写速度优化代码的理论问题。不是关于“搜索瓶颈” 我可以自己测量代码速度。但这不是关于使用microtime()的家庭作业的问题。这是一个关于PHP解释器如何工作的问题(我自己通过挖掘google试图弄清楚,但没有找到答案) 此外,我自己做了测量,有点困惑。$a、$b

哪种施工速度更快:

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

所有变量都是局部变量

乘法、加法、减法和除法的速度不同吗

更新: 以下是一些澄清:

  • 这是一个关于从头开始编写速度优化代码的理论问题。不是关于“搜索瓶颈”
  • 我可以自己测量代码速度。但这不是关于使用microtime()的家庭作业的问题。这是一个关于PHP解释器如何工作的问题(我自己通过挖掘google试图弄清楚,但没有找到答案)
  • 此外,我自己做了测量,有点困惑。$a、$b和$c的不同起始值(零、负、正、整数和浮点的组合)在构造之间产生不同的结果。所以我很困惑
  • BoltClock为我提供了有用的信息,但user576875通过发布操作码解码器的链接让我大开眼界!他的回答也直接回答了我的问题。谢谢

    <?php
    function run(){
    $b=10;
    $c=10;
    $start=gettimeofday(TRUE);
    for($k=0;$k<10000000;$k++){
      $a = $b * $c ? $b * $c : 0;  
    }
    printf("%f\n", gettimeofday(TRUE)-$start);
    $start=gettimeofday(TRUE);
    for($k=0;$k<10000000;$k++){
      $i = $b * $c;  
      $a = $i ? $i : 0;  
    }
    printf("%f\n", gettimeofday(TRUE)-$start);
    }
    run();
    ?>
    
    因此,单独分配的速度稍微快一点。对于加法,(+而不是*),我得到了相反的结果:

    1.386522
    1.450358
    

    因此,您确实需要在您自己的系统上测量这些值—使用不同的PHP版本,结果可能会再次发生变化。

    您的两段代码各有一个缺点。一个做额外的任务;另一个做额外的数学运算。最好两种方法都不做,使用PHP5.3中的三元运算符,您可以:

    $a = $b * $c ?: 0;
    
    省略三元数的第二部分会导致PHP将第一部分的结果放在那里


    使用马丁五世。Löwis的基准测试代码,我估计这比这两种代码都快25%。

    如果您使用的是PHP5.3,那么速度会更快:

    $a = $b * $c ? $b * $c : 0;  
    
    $a = $b * $c ?: 0; 
    
    这与
    $a=$b*$c相同$b*$c:0
    ,但
    $a*$b
    计算只执行一次。而且,它不会像在第二个解决方案中那样执行额外的任务

    使用马丁五世。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
    
    现在这些都是微优化,所以在执行此操作之前,可能有很多方法可以优化代码:)

    如果不是这样,您可能还希望比较生成的PHP操作代码:

    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
    
    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
    
    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
    
    3<代码>$a=$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
    
    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
    


    这些操作代码列表是由扩展生成的。

    为什么不自己比较一下呢?不管怎样,你确定这是代码中最慢的部分吗?第一部分,但它无关紧要,除非你碰巧需要在一页上做几千次load@Dagon:在这种情况下,千是不够的。我投票支持100k+。几微秒重要吗?有趣的是,如果你设置
    $b=0,你得到了
    $a=$b*$c$b*$c:0比另一个运行得快得多。所以结论是,取决于输入:)@Lionel Chan:真有趣。还请注意,这种优化只发生在乘法运算中-0的加法显然不是特例。@莱昂内尔:如果其中一个操作数是
    0
    ,它可能会将其优化为
    0
    (我认为)优化发生是因为对于第一个块,它需要进行乘法、比较和赋值,对于第二个块,它需要进行乘法、赋值、比较和赋值。无论哪种模式在优化中都没有多大帮助,马丁先生,你是对的。一个人必须知道一些关于测量代码的事情。例如,您的测试没有测量任何内容,因此是无用的
    ($a=1)或0,和或始终计算为布尔值!这正是我需要的!我甚至不知道这是可能的!我应该使用哪个工具或函数来产生这样的结果?添加了一个链接到用于生成这些结果的VLD扩展listings@user576875:谢谢!现在我真的可以自己找到这些问题的答案了!哇!它是Xdebug作者的扩展!