PHP 对象比数组省内存?错!数组比对象省内存?错!

刚刚一个群里有人引出了 PHP 数组和对象占用内存谁多谁少的问题。我想起之前我好像也测试过这个问题,和群里人说的对象比数组节省内存的结论相反,我得出的是数组比对象节省内存

但今天,我想说,这两种说法都不对!!!

话不多说,直接上代码:

 /**
 * 随机生成文本
 * @param int $length
 * @return string
 */
function randomText($length)
{
    $chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
    $charLength = mb_strlen($chars);
    $result = '';
    for($i = 0; $i < $length; ++$i)
    {
        $result .= mb_substr($chars, mt_rand(1, $charLength) - 1, 1);
    }
    return $result;
}
 
class AAA
{
    public $a,$b,$c,$d,$e;
      
    public function __construct(...$v)
    {
        $this->a = $v[0];
        $this->b = $v[1];
        $this->c = $v[2];
        $this->d = $v[3];
        $this->e = $v[4];
    }
}
  
$max = 10000;
  
$a = memory_get_usage();
$list1 = [];
for($i = 0; $i < $max; ++$i)
{
    $list1[] = ['a'=>randomText(16), 'b'=>randomText(16), 'c'=>randomText(16), 'd'=>randomText(16), 'e'=>randomText(16)];
}
echo 'PHP 数组内存占用:', memory_get_usage() - $a, PHP_EOL;
  
$a = memory_get_usage();
$list2 = [];
for($i = 0; $i < $max; ++$i)
{
    $obj = new stdClass();
    $obj->a = randomText(16);
    $obj->b = randomText(16);
    $obj->c = randomText(16);
    $obj->d = randomText(16);
    $obj->e = randomText(16);
    $list2[] = $obj;
}
echo 'PHP stdClass内存占用:', memory_get_usage() - $a, PHP_EOL;
  
$a = memory_get_usage();
$list3 = [];
for($i = 0; $i < $max; ++$i)
{
    $list3[] = new AAA(randomText(16),randomText(16),randomText(16),randomText(16),randomText(16));
}
echo 'PHP 自定义类内存占用: ', memory_get_usage() - $a, PHP_EOL;

运行结果:(不同人跑结果不同,但是谁多谁少不会变)

PHP 数组内存占用:6688472

PHP stdClass内存占用:7211320

PHP 自定义类内存占用: 4339512

结论:PHP 数组、对象内存占用,自定义类<数组<stdClass

原文地址:https://blog.yurunsoft.com/a/119.html

转载于:https://my.oschina.net/yurun/blog/1930067

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: PHP内存溢出可以通过以下几种方法进行优化: 1. 优化代码:检查代码是否存在内存泄漏、循环引用等问题,可以使用 PHP 内置的工具 xdebug 进行分析定位问题。 2. 增加内存限制:可以通过修改 PHP 配置文件中的 memory_limit 参数来增加 PHP 的可用内存。但是要注意,增加内存限制可能会导致其他性能问题,因此应该谨慎使用。 3. 减少内存使用:可以通过减少变量使用、使用更高效的算法、避免多次查询数据库等方法来减少 PHP内存使用。 4. 使用缓存:可以使用缓存来避免频繁的查询数据库和计算操作,从而减少 PHP内存使用。 5. 升级硬件:如果以上方法无法解决问题,可以考虑升级服务器硬件,增加可用内存和 CPU 资源。 ### 回答2: PHP内存溢出是指在PHP程序运行过程中,分配给程序的内存不足以满足程序的内存需求,导致程序无法正常执行或崩溃的现象。下面是一些优化策略来解决PHP内存溢出问题: 1. 优化算法和逻辑:检查程序逻辑,确保使用最佳的算法和避免不必要的内存分配。减少循环嵌套、递归调用和无尽的迭代。 2. 减少数据量和处理:通过限制查询结果集的大小、分批进行处理或跳过不必要的数据,减少内存的使用。可以使用数据库的分页查询、缓存机制或延迟加载等技术。 3. 释放不再使用的内存:在程序执行过程中,及时释放不再使用的变量、对象和资源。 4. 调整PHP配置:增加PHP的最大内存限制(memory_limit),可以通过编辑php.ini文件或在代码中使用ini_set函数进行设置。 5. 使用合适的数据结构和缓存:根据具体需求,选择合适的数据结构和缓存机制来优化内存使用。例如,使用数组代替对象、使用缓存技术避免重复计算等。 6. 优化第三方库和模块:检查使用的第三方库或模块是否存在内存泄漏或内存占用过高的问题,可以尝试更新版本或寻找替代方案。 7. 分析和调试工具:使用内存分析工具,如Xdebug、Zend Debugger等,来定位和解决内存溢出问题。 总之,优化PHP内存溢出问题需要综合考虑程序逻辑、数据处理、PHP配置、数据结构和缓存等多个方面,根据具体情况采取相应的优化措施,以提高程序的性能和稳定性。 ### 回答3: 在PHP中,处理大量数据或使用大内存的程序可能会导致内存溢出。以下是一些优化技巧来减少PHP内存溢出的可能性: 1. 优化代码逻辑:检查代码中是否有无限循环、递归调用等因素可能导致内存溢出的问题,并进行修复。 2. 减少内存占用:尽量使用更少的内存来执行操作。例如,使用迭代而不是递归来处理大量数据,避免一次性加载大量数据到内存中。 3. 使用适当的数据结构:选择适当的数据结构以减少内存的使用。例如,使用生成器(Generator)来逐行处理大文件,而不是一次性将整个文件加载到内存中。 4. 及时释放内存:在处理大量数据时,及时释放不再需要的变量、对象等资源,可以使用unset()函数来释放变量所占用的内存。 5. 调整PHP配置参数:调整PHP内存限制参数(如memory_limit)为合适的值,确保分配足够的内存来处理大数据操作。 6. 使用缓存:利用缓存系统(如Memcached、Redis等),将一些常用的数据缓存起来,减少频繁读取数据库或计算过程。 7. 使用分页或分块处理:如果可能,将大规模数据的操作分页或分块处理,减少一次性处理大量数据的压力。 8. 升级硬件:如果以上优化仍然无法解决内存溢出的问题,可以考虑升级服务器硬件,增加可用的内存容量。 重要注意事项:在进行内存优化时,应该进行充分的测试和排查,以确保不会影响系统的正常运行和各种边界情况的处理。同时,可以使用内存分析工具来帮助定位和解决内存溢出问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值