当前位置:  开发笔记 > 编程语言 > 正文

如何确定变量的内存占用(大小)?

如何解决《如何确定变量的内存占用(大小)?》经验,为你挑选了4个好方法。

PHP(或PHP扩展)中是否有一个函数可以找出给定变量使用了多少内存?sizeof只是告诉我元素/属性的数量.

memory_get_usage有助于它给我整个脚本使用的内存大小.有没有办法为单个变量执行此操作?

请注意,这是在开发机器上,因此加载扩展或调试工具是可行的.



1> Tatu Ulmanen..:

没有直接的方法来获取单个变量的内存使用情况,但正如Gordon建议的那样,你可以使用memory_get_usage.这将返回分配的内存总量,因此您可以使用变通方法并测量前后使用情况以获取单个变量的使用情况.这有点hacky,但它应该工作.

$start_memory = memory_get_usage();
$foo = "Some variable";
echo memory_get_usage() - $start_memory;

请注意,这绝不是一种可靠的方法,您无法确定在分配变量时没有其他任何内容触及内存,因此这只应用作近似值.

实际上,您可以通过在函数内创建变量的副本并测量使用的内存来将其转换为函数.没有测试过这个,但原则上我没有看到它有什么问题:

function sizeofvar($var) {
    $start_memory = memory_get_usage();
    $tmp = unserialize(serialize($var));
    return memory_get_usage() - $start_memory;
}


`$ tmp = $ var`将创建一个浅表副本.在修改$ tmp之前,这不会分配更多内存.
怎么样`$ tmp = unserialize(serialize($ var))`; 这将结合Aistina的方法.
另外,由于`$ var`已经是传递给函数的浅层副本或引用,你不需要`$ tmp`,但可以重新分配给`$ var`.这将内部引用从`$ tmp`保存到`$ var`.

2> Vineet1982..:

您可能需要Memory Profiler.我收集了信息,但是我复制了一些可能对你有帮助的重要事情.

您可能知道,自从2.*版本以来,Xdebug删除了内存分析支持.请在此处搜索"已删除的函数"字符串:http://www.xdebug.org/updates.php

删除了功能

删除了对内存分析的支持,因为它无法正常工作.

其他Profiler选项 PHP-存储器廓

https://github.com/arnaud-lb/php-memory-profiler.这是我在Ubuntu服务器上完成的启用它:

sudo apt-get install libjudy-dev libjudydebian1
sudo pecl install memprof
echo "extension=memprof.so" > /etc/php5/mods-available/memprof.ini
sudo php5enmod memprof
service apache2 restart

然后在我的代码中:



最后callgrind.out用KCachegrind打开文件

使用谷歌gperftools(推荐!)

首先在此处下载最新的软件包来安装Google gperftools:https://code.google.com/p/gperftools/

然后一如既往:

sudo apt-get update
sudo apt-get install libunwind-dev -y
./configure
make
make install

现在在您的代码中:

memprof_enable();

// do your magic

memprof_dump_pprof(fopen("/tmp/profile.heap", "w"));

然后打开终端并启动:

pprof --web /tmp/profile.heap

pprof将在您现有的浏览器会话中创建一个新窗口,如下所示:

使用memprof和gperftools进行PHP内存分析

Xhprof + Xhgui(在我看来,最好的配置cpu和内存)

使用XhprofXhgui,您可以分析cpu的使用情况,或者只是内存使用情况,如果这是您目前的问题.这是一个非常完整的解决方案,它可以让您完全控制,并且可以在mongo或文件系统中编写日志.

欲了解更多详细信息,请参见这里.

黑火

Blackfire是SensioLabs的PHP探查器,Symfony2人员https://blackfire.io/

如果您使用puphpet设置您的虚拟机,您会很高兴知道它的支持;-)

Xdebug和跟踪内存使用情况

XDEBUG2是PHP的扩展.Xdebug允许您记录所有函数调用,包括参数和返回值到不同格式的文件.有三种输出格式.一个是人类可读的跟踪,另一个更适合计算机程序,因为它更容易解析,最后一个使用HTML格式化跟踪.您可以使用该设置在两种不同格式之间切换.这里有一个例子

forp

forp简单,非侵入式,面向生产,PHP分析器.一些功能是:

测量每个功能的时间和分配的内存

CPU使用率

函数调用的文件和行号

输出为Google的跟踪事件格式

功能标题

功能分组

函数别名(对匿名函数有用)

DBG

DBG是一个功能齐全的php调试器,一个可以帮助您调试PHP脚本的交互式工具.它适用于生产和/或开发WEB服务器,允许您从IDE或控制台本地或远程调试脚本,其功能包括:

远程和本地调试

显式和隐式激活

调用堆栈,包括函数调用,动态和静态方法调用及其参数

通过调用堆栈导航,能够评估相应(嵌套)位置中的变量

步入/退出/跳过/运行到光标功能

条件断点

全球断点

记录错误和警告

并行调试的多个同时会话

支持GUI和CLI前端

支持IPv6和IPv4网络

调试器传输的所有数据都可以选择使用SSL进行保护


这正是*我正在寻找的信息,谢谢.

3> Aistina..:

不,那里没有.但你可以serialize($var)检查strlen结果的近似值.


这是一个可怕的近似.PHP中数组中的每个项目都是~80个字节,但是`strlen(serialize(array(1,2,3)))`是30.
至少相对大小的良好启发式.
@Aistina,-1.你在测量错误的东西.变量和序列化变量是两个*完全*不同的东西,并将给出完全不同的结果.

4> para..:

回答Tatu Ulmanens的回答:

应该注意,它$start_memory本身将占用内存(PHP_INT_SIZE * 8).

所以整个功能应该变成:

function sizeofvar($var) {
    $start_memory = memory_get_usage();
    $var = unserialize(serialize($var));
    return memory_get_usage() - $start_memory - PHP_INT_SIZE * 8;
}

很抱歉将此作为额外答案添加,但我还不能评论答案.

更新:*8不是确定的.它显然可能依赖于php版本,可能还有64/32位.


你能解释为什么`*8`?谢谢!
推荐阅读
ERIK又
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有