med*_*edk 7 php memory resources
我遇到了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();
?>
Run Code Online (Sandbox Code Playgroud)
哪个回报:
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
Run Code Online (Sandbox Code Playgroud)
这使:
1)5355216 - 355120 = 5000096字节
2)5356008 - 355120 = 5000888字节
如果这是它的工作方式,我假设第一个355120字节是apache和其他模块使用的整个系统分配的内存,因为当你增加或减少重复次数时,第一个值永远不会改变str_repeat(),只有两个值后面的过程增加或减少,但永远不会变小第一个值.
好的,你的第一个断言第一个memory_get_usage()应该是0是错误的.根据PHP的文档:
返回当前分配给PHP脚本的内存量(以字节为单位).
您的脚本正在运行,因此必须为其分配一些内存.第一个电话会告诉您这是多少.
str_repeat()不应该使用那么多内存的第二个断言并没有看到整个图片.
你有重复100,000次的字符串"hello"(使用5个字节),总共500,000个字节......最小值.问题是,PHP是如何执行此操作的?他们使用这样的代码吗?(伪):
s = ""
for(i=0; i<100000; i++)
s += "hello"
Run Code Online (Sandbox Code Playgroud)
此代码将要求您为for循环的每次迭代重新分配新字符串.现在我不能假装说我知道PHP如何实现str_repeat(),但你必须非常小心如何使用内存来降低内存使用率.从事物的外观来看,他们并没有像他们所拥有的那样管理那个功能中的记忆.
第三,峰值内存使用量和当前内存使用量之间的差异可能来自使函数调用str_repeat()所需的堆栈,以及该函数中所需的任何局部变量.函数返回时可能会回收内存.
最后,Apache在不同的进程中运行,我们正在处理虚拟内存.Apache所做的任何事都不会影响memory_get_usage()的结果,因为进程不会"共享"虚拟内存.
根据php手册,memory_get_usage返回分配给php 的内存量,不一定是使用的量.
| 归档时间: |
|
| 查看次数: |
14200 次 |
| 最近记录: |