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;
或
所有变量都是局部变量
乘法、加法、减法和除法的速度不同吗
更新:
以下是一些澄清:
<?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作者的扩展!