PHP 5.3 を使用している場合は、こちらの方が高速です。
$a = $b * $c ?: 0;
これは と同じです$a = $b * $c ? $b * $c : 0;
が、$a*$b
計算は 1 回だけ行われます。また、2 番目のソリューションのように追加の割り当ては行いません。
Martin v. 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 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
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: 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
これらの OP コード リストは、VLD拡張機能によって生成されました。