2

次の2つのコードがあります。

1:

$i = 0;
while(1)
{
    $i++;

    echo "big text for memory usage ";
    if ( $i == 50000 )
    break;
}

echo "<br />" . memory_get_usage();

毎回エコーします:1626464

2:

$i = 0;
for(;;)
{
    $i++;

    echo "big text for memory usage ";
    if ( $i == 50000 )
    break;
}

echo "<br />" . memory_get_usage();

毎回エコーします:1626656

誰かが2つの異なるメモリ使用量のこの違いを説明できますか?たとえ小さくても...

4

2 に答える 2

4

実装の詳細です。for ループでは、PHP はおそらくスペースを使用して 3 つのポインターを格納します。1 つは for 初期化用、もう 1 つはインクリメント用、もう 1 つは停止条件用です。64 ビット システムを使用している場合、これが表示される64 * 3 = 192余分なビットの原因となります。もちろん、実際のコードを見ないと、私が正しいかどうかを判断するのは困難です。

于 2012-09-27T12:49:23.927 に答える
4

表示されているメモリの量の違いはごくわずかであり、気にする必要はありません。2 つのループをコンパイルする方法は、メモリ使用量には影響しませんが、実行速度に影響を与える可能性があります (それでも無視できる程度です)。

例: while(1): これにより、コンパイラ1は true かどうかをチェックします。そうでない場合は、ループの最後にジャンプします。そうである場合は、ループの内容を処理します。

for(;;): 標準のforループは 3 つのことを行います。スキップするイテレータを定義し、イテレータが条件を満たしているかどうかをチェックします。これもスキップし、本文のコンテンツを実行してから、イテレータをインクリメントして条件チェックに戻ります。ジャンプはすべてそのままですが、コードはそれぞれで何もしません (したがって、「無限ループ」 - もちろん、手動で中断するまで)。

forなぜ-loop のメモリがわずかに増加するのかについての潜在的な答えの純粋な推測として、それが動作するはずの方法が原因である可能性があります-定義された/管理されたイテレータを使用します。PHP は、使用していない場合でも、この反復子とガベージ コレクションに対応するために、非常に小さい場合でも余分なスペースを事前に割り当てることができます。

于 2012-09-27T12:50:08.770 に答える