0

我试图比较内存中使用的常量和变量,但发现了一个奇怪的现象。

测试代码:

<?php
var_dump( memory_get_usage() );  // int(129100)
// I don't understand: I don't do someting but why there has the changed
var_dump( memory_get_usage() );  // int(129156)  
var_dump( memory_get_usage() );  // int(129156)

define('hello', 'WORLD');
// why here hasn't changed
var_dump( memory_get_usage() );  // int(129156)

$hello = 'WORLD';
var_dump( memory_get_usage() );  // int(129304)
?>
4

2 回答 2

2

你并不是什么都不做。该var_dump调用可能正在初始化某些东西或留下一些东西。

参阅php_var_dumphttps://github.com/php/php-src/blob/master/ext/standard/var.c

于 2012-08-15T16:14:47.017 回答
2

第一:PHP有很多内存泄漏。这意味着,它确实在某处分配内存,但不会释放它。所以不要害怕看到这样的效果。但这一次可能是别的东西:

看这个例子:

<?php

$data = array(0,0,0,0);
$data[0] = memory_get_usage();
$data[1] = memory_get_usage();

echo $data[0];
echo "\n";
echo $data[1];
echo "\n";

$data[2] = memory_get_usage();
echo $data[2];
echo "\n";
$data[3] = memory_get_usage();
echo $data[3];
echo "\n";

?>

输出将如下所示:

626464
626464
626528
626528

您会看到它在第一次调用“echo”后发生了变化,这必须为输出缓冲区或类似的东西分配内存。也许它在内部使用 printf(buffer, "...", ...) 来生成发送到标准输出的字符串。该字符串在以后的调用中被重用,如果需要,只需将其大小调整为更长的缓冲区。

您对 var_dump 的调用间接使用了 echo 函数,并且可能还使用了一些内部缓冲区,这是在第一次调用时分配的。

解决方案:为了更准确地测量事物,您应该在“测量”之前调用每个输出函数一次,或者在结果的最终输出之前永远不要调用它们。

于 2012-08-15T16:35:07.560 回答