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

memory_get_usage
EN

Stack Overflow用户
提问于 2010-03-09 21:57:29
回答 4查看 3.3K关注 0票数 5

我创建了一个小基准测试类来显示页面加载时间和内存使用情况。加载时间已经在工作了,但是当我显示内存使用情况时,它没有改变示例:

代码语言:javascript
复制
$conns = array();
ob_start();
benchmark::start();
$conns[] = mysql_connect('localhost', 'root', '');
benchmark::stop();
ob_flush();

使用的内存与

代码语言:javascript
复制
$conns = array();
ob_start();
benchmark::start();
for($i = 0; $i < 1000; $i++)
{
   $conns[] = mysql_connect('localhost', 'root', '');
}
benchmark::stop();
ob_flush();

我使用memory_get_usage(true)来获取以字节为单位的内存使用情况。

EN

回答 4

Stack Overflow用户

发布于 2010-03-09 22:19:02

memory_get_usage(true)将显示php引擎分配的内存量,而不是脚本实际使用的内存量。您的测试脚本很可能不需要引擎请求更多的内存。

对于测试,抓取一个大(Ish)文件并将其读取到内存中。那么您应该会看到一个变化。

我已经成功地使用memory_get_usage(true)来跟踪网络爬行脚本的内存使用情况,并且运行良好(因为它的目标是在达到系统内存限制之前放慢速度)。要记住的一件事是,它不会根据实际使用情况而改变,它会根据引擎请求的内存而改变。所以你最终看到的是突然的跳跃,而不是减慢增长(或收缩)。

如果你设置了 real_usage 标志为false,你可能会看到非常小的内存变化-然而,这并不能帮助你监控php从系统请求的真实内存量。

(更新:明确地说,我描述的区别是脚本变量使用的内存与引擎运行脚本所请求的内存之间的差异。所有相同的脚本,不同的测量方式。)

票数 8
EN

Stack Overflow用户

发布于 2010-03-09 22:00:30

我不是PHP内部的专家,但是我可以想象echo不会影响PHP使用的内存量,因为它只是向客户机输出一些东西。

如果启用输出缓冲,情况可能会有所不同。

以下几点应该会有所不同:

代码语言:javascript
复制
$result = null;
benchmark::start()
for($i = 0; $i < 10000; $i++)
{
   $result.='test';
}
票数 2
EN

Stack Overflow用户

发布于 2010-03-09 22:39:16

请看:

代码语言:javascript
复制
for($i = 0; $i < 1000; $i++)
{
   $conns[] = mysql_connect('localhost', 'root', '');
}

你可以循环到100,000,什么都不会改变,这是相同的连接。没有为它分配资源,因为记住它们的链表永远不会增长。为什么它会增长?在$conns[0]中已经(假设)有一个有效的句柄。这在memory_get_usage()中不会有什么不同。你确实测试了$conns[15],看看它是否能工作,对吧?

root@localhost可以有多个密码吗?不是的。为什么PHP会因为你告诉它去处理另一个连接而烦恼呢?(半开玩笑的)。

我建议通过命令行界面通过Valgrind运行同样的东西来查看实际的堆使用情况:

valgrind /usr/bin/php -f foo.php ..或者类似的东西。在底部,您将看到分配了什么、释放了什么以及垃圾回收工作。

免责声明:我确实熟悉PHP的内部结构,但我不是用C编写的故意混淆迷宫的专家,Zend称之为PHP。

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

https://stackoverflow.com/questions/2409477

复制
相关文章

相似问题

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