首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PHP memory_get_usage

PHP memory_get_usage
EN

Stack Overflow用户
提问于 2010-10-25 06:20:21
回答 3查看 15K关注 0票数 8

我偶然发现了PHP的memory_get_usage()memory_get_peak_usage()

问题是我发现这两个函数并没有提供当前脚本使用的实际内存。我的测试脚本是:

代码语言:javascript
复制
<?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的值,但不要太大。

第三个是“峰值”值,它比第二个值稍大,因为我认为它应该是处理微秒中的最大值。

那么,您是否认为当前脚本的内存消耗的实际值应该是这样的:

代码语言:javascript
复制
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()中的重复次数时,第一个值永远不会改变,只有进程之后的两个值增加或减少,但永远不会小于第一个值。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-10-25 06:24:06

根据php手册,memory_get_usage返回分配给php的内存量,而不一定是正在使用的内存量。

票数 7
EN

Stack Overflow用户

发布于 2010-10-25 06:33:42

好了,您第一次断言第一个memory_get_usage()应该为0是错误的。根据PHP的文档:

PHP返回当前分配给

脚本的内存量。

您的脚本正在运行,因此必须为其分配一些内存。第一个调用会告诉您这是多少钱。

第二个关于str_repeat()不应该使用那么多内存的断言并没有着眼于全局。

字符串"hello“(使用5个字节)重复了100,000次,总共有500,000个bytes...minimum。问题是,PHP是如何执行此操作的?他们是否使用了这样的代码?(伪代码):

代码语言:javascript
复制
s = ""
for(i=0; i<100000; i++)
    s += "hello"

此代码将要求您为for循环的每次迭代重新分配一个新字符串。现在,我不能假装知道PHP是如何实现str_repeat()的,但是您必须非常小心地使用内存来降低内存使用量。从表面上看,它们没有在该函数中很好地管理内存。

第三,峰值内存使用量和当前内存使用量之间的差异可能来自调用str_repeat()函数所需的堆栈,以及该函数中所需的任何局部变量。函数返回时,内存可能已被回收。

最后,Apache运行在一个不同的进程中,我们正在处理虚拟内存。Apache所做的任何事情都不会影响memory_get_usage()的结果,因为进程不“共享”虚拟内存。

票数 7
EN

Stack Overflow用户

发布于 2010-10-25 06:35:33

在我的例子中( Mac OS X 10.5上的PHP 5.3.3 ),您的脚本打印:

323964

824176

824980

现在,第二次测量和第一次测量之间的差值为500212,这非常接近"hello“(5)乘以100,000的长度。所以我会说在这里没有什么惊喜。峰值稍大一些,因为在评估这些语句时会有一些临时分配。

(你的其他问题已经回答了)

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4010781

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档