3

この質問は「少し的外れ」かもしれません。しかし、多かれ少なかれそれはコードのマイクロベンチングですが、PHP のバックエンドに関する私の基準と一般的な知識を向上させるためのものです。

それで!では、質問です!変数を 2 回呼び出すと、PHP で追加の else 条件を呼び出すよりもメモリ (および CPU の負荷) が少なくて済みますか? より多くのリソースを必要とするのはどれですか? なぜ?

以下の例:
Aは、変数を 2 回呼び出すことを示し、Bは、追加の else 条件を呼び出すことを示しています。もちろん、どちらも同じ最終結果になります。

回答(応答)への追加の参照も非常に適切です!もし可能なら。

例 A:

$a = 1;
if (isset($array['a']))
{
    $a = $array['a'];
}

$b = NULL;
if (isset($array['b']))
{
    $b = $array['b'];
}



例 B:

if (isset($array['a']))
{
    $a = $array['a'];
}
else
{
    $a = 1;
}

if (isset($array['b']))
{
    $b = $array['b'];
}
else
{
    $b = NULL;
}
4

4 に答える 4

3

これら2つによって生成されたPHPオペコードは、ほとんどの最新バージョンのphpで同一または同等であると感じています。自分で試してみてください: http://blog.ircmaxell.com/2012/07/the-anatomy-of-equals-opcode-analysis.html

参考までに、A などの php 5.3x で生成されたオペコードを次に示します。

 2     0  >   ASSIGN                                                   !0, 1
 3     1      ZEND_ISSET_ISEMPTY_DIM_OBJ                    1  ~1      !1, 'a'
 4     2    > JMPZ                                                     ~1, ->6
 5     3  >   FETCH_DIM_R                                      $2      !1, 'a'
       4      ASSIGN                                                   !0, $2
 6     5    > JMP                                                      ->6
 8     6  >   ASSIGN                                                   !2, null
 9     7      ZEND_ISSET_ISEMPTY_DIM_OBJ                    1  ~5      !1, 'b'
10     8    > JMPZ                                                     ~5, ->12
11     9  >   FETCH_DIM_R                                      $6      !1, 'b'
      10      ASSIGN                                                   !2, $6
12    11    > JMP                                                      ->12
13    12  > > RETURN                                                   1

例 B は次のとおりです。

 2     0  >   ZEND_ISSET_ISEMPTY_DIM_OBJ                    1  ~0      !0, 'a'
 3     1    > JMPZ                                                     ~0, ->5
 4     2  >   FETCH_DIM_R                                      $1      !0, 'a'
       3      ASSIGN                                                   !1, $1
 5     4    > JMP                                                      ->6
 8     5  >   ASSIGN                                                   !1, 1
11     6  >   ZEND_ISSET_ISEMPTY_DIM_OBJ                    1  ~4      !0, 'b'
12     7    > JMPZ                                                     ~4, ->11
13     8  >   FETCH_DIM_R                                      $5      !0, 'b'
       9      ASSIGN                                                   !2, $5
14    10    > JMP                                                      ->12
17    11  >   ASSIGN                                                   !2, null
19    12  > > RETURN                                                   1

処理されるコードの行数、割り当て、およびジャンプの数は同じです。少し違うところを飛び回っているだけですが、一見すると、実際に実行されたコマンドではなく、実行の順序だけが異なっているように見えます。

于 2013-10-11T21:14:47.143 に答える
1

最小限のパフォーマンスの違いを無視して、最初に変数を定義することをお勧めします。

PHP は (まだ) 型安全ではありませんが、例 Bの結果が 2 つの異なる型の変数 $a になると想像してください。

if (isset($array['a']))
{
    $a = $array['a']; // could be a string or anything else
}
else
{
    $a = 1; // is an integer
}

簡単に問題になる可能性のある後続のコードの厳密な条件の場合。$array['a']例:値があると仮定します'1'

以下は失敗する可能性があります:

if ( $a === 1 ) // do something

ここでは、型と値が一致する必要がありますが、これTRUEは上記の else ケースのみです。$a = 1;

于 2014-04-17T17:38:38.520 に答える
1

計ってませんが、他に評価はありません。あなたがelseifを持っていた場合、非常に小さな違いがあるかもしれません. この例は、おそらく読みやすさやコーディングの好みに帰着します。

于 2013-10-11T21:14:20.873 に答える