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

任何人都可以解释这两种不同的内存使用之间的差异吗?即使他们那么小……

4

2 回答 2

4

这是一个实现细节。对于 for 循环,PHP 可能会使用一些空间来存储三个指针,一个用于初始化,一个用于递增,一个用于停止条件。如果您使用的是 64 位系统,那么这说明了64 * 3 = 192您所看到的额外位。当然,如果不查看实际代码,很难判断我是否正确。

于 2012-09-27T12:49:23.927 回答
4

您看到的内存差异量非常微不足道,不应该是一个问题。这两个循环的编译方式不应影响内存使用,但它们可能会影响运行时速度(尽管仍然可以忽略不计)。

例如: while(1): 这将导致编译器检查是否1为真;如果不是,它将跳转到循环的末尾 - 如果是,它将处理循环的内容。

for(;;): 一个标准的for循环做三件事。它定义了一个迭代器,你可以跳过它,检查迭代器是否满足条件,你也跳过它,执行正文内容,然后递增迭代器并跳回条件检查。跳转仍然在原地,但是您的代码在每个处都没有做任何事情(因此是“无限循环” - 当然,直到您手动中断)。

作为一个潜在答案的纯粹猜测 - 为什么for-loop 在内存中会有非常轻微的增加可能是因为它应该工作的方式 - 使用定义/托管的迭代器。即使您不使用它,PHP 也可以预先分配额外的空间(如果非常小)以容纳此迭代器和垃圾收集。

于 2012-09-27T12:50:08.770 回答