我偶然发现了PHP的memory_get_usage()和memory_get_peak_usage()。
问题是我发现这两个函数并没有提供当前脚本使用的实际内存。我的测试脚本是:
<?php
echo memory_get_usage();
echo '<br />';
$a = str_repeat('hello', 100000);
echo '<br />';
echo memory_get_usage();
echo '<br />';
echo memory_get_peak_usage();
?>它返回:
355120
5355216
5356008
你从这件事中理解了什么?
第一个值是在执行str_repeat()之前,所以它必须是0的值。
第二个是在过程之后,可以有一个大于0的值,但不要太大。
第三个是“峰值”值,它比第二个值稍大,因为我认为它应该是处理微秒中的最大值。
那么,您是否认为当前脚本的内存消耗的实际值应该是这样的:
memory_usage = the second memory usage - the first memory usage
peak_memory_usage = the third (peak_usage) - the first memory usage这就给出了:
1) 5355216 - 355120 = 5000096字节
2) 5356008 - 355120 = 5000888字节
如果它是这样工作的,我假设第一个355120字节是apache和其他模块使用的整个系统分配的内存,因为当您增加或减少str_repeat()中的重复次数时,第一个值永远不会改变,只有进程之后的两个值增加或减少,但永远不会小于第一个值。
发布于 2010-10-25 06:24:06
根据php手册,memory_get_usage返回分配给php的内存量,而不一定是正在使用的内存量。
发布于 2010-10-25 06:33:42
好了,您第一次断言第一个memory_get_usage()应该为0是错误的。根据PHP的文档:
PHP返回当前分配给
脚本的内存量。
您的脚本正在运行,因此必须为其分配一些内存。第一个调用会告诉您这是多少钱。
第二个关于str_repeat()不应该使用那么多内存的断言并没有着眼于全局。
字符串"hello“(使用5个字节)重复了100,000次,总共有500,000个bytes...minimum。问题是,PHP是如何执行此操作的?他们是否使用了这样的代码?(伪代码):
s = ""
for(i=0; i<100000; i++)
s += "hello"此代码将要求您为for循环的每次迭代重新分配一个新字符串。现在,我不能假装知道PHP是如何实现str_repeat()的,但是您必须非常小心地使用内存来降低内存使用量。从表面上看,它们没有在该函数中很好地管理内存。
第三,峰值内存使用量和当前内存使用量之间的差异可能来自调用str_repeat()函数所需的堆栈,以及该函数中所需的任何局部变量。函数返回时,内存可能已被回收。
最后,Apache运行在一个不同的进程中,我们正在处理虚拟内存。Apache所做的任何事情都不会影响memory_get_usage()的结果,因为进程不“共享”虚拟内存。
发布于 2010-10-25 06:35:33
在我的例子中( Mac OS X 10.5上的PHP 5.3.3 ),您的脚本打印:
323964
824176
824980
现在,第二次测量和第一次测量之间的差值为500212,这非常接近"hello“(5)乘以100,000的长度。所以我会说在这里没有什么惊喜。峰值稍大一些,因为在评估这些语句时会有一些临时分配。
(你的其他问题已经回答了)
https://stackoverflow.com/questions/4010781
复制相似问题