while(1)与for(;;)中的奇怪内存使用

时间:2012-09-27 12:45:07

标签: php performance execution-time

我有以下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 个答案:

答案 0 :(得分:3)

您所看到的记忆差异的数量可以忽略不计,不应该成为一个问题。编译这两个循环的方式不应该影响内存使用,但它们可能会影响运行时速度(但仍然可以忽略不计)。

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

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

作为一个潜在答案的纯粹猜测,为什么for - 循环在内存中有一个非常轻微的提升,可能因为它的工作方式 - 与定义/管理的迭代器。 PHP可以预先分配额外的空间,如果非常小,即使你没有使用它也可以容纳这个迭代器和垃圾收集。

答案 1 :(得分:2)

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