文档章节

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

宇润
 宇润
发布于 08/18 17:15
字数 469
阅读 35
收藏 0
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

© 著作权归作者所有

共有 人打赏支持
宇润

宇润

粉丝 51
博文 8
码字总数 4761
作品 16
无锡
技术主管
私信 提问
Redis学习笔记4--Redis数据存储优化机制

Redis学习笔记4--Redis数据存储优化机制 1.zipmap优化hash: 前面谈到将一个对象存储在hash类型中会占用更少的内存,并且可以更方便的存取整个对象。省内存的原因是新建一个hash对象时开始是用...

DemonsI
10/08
0
0
Redis中Key相关的常用指令详解

Redis是一个开源的使用ANSI C 语言编写、支持网络、同memcache相比在Redis下可以实现基于内存亦可持久化的日志型、Key-Value 类型的NoSQL数据库,且在Redis中Key的类型也更为丰富。所以较为广...

往事_Jim_遗
2017/11/02
0
0
redis key和value数据类型

exists key del key1 key2 Redis 的vaule redis 提供五种数据类型:string,hash,list,set 及sorted set。 string 是最基本的类型,而且string 类型是二进制安全的。意思是redis 的string 可以...

Airship
01/23
0
0
怎么保存和输出复选框(checkbox)的数据?

想实现功能:多个复选值不一样,是转为字符串再保存到数据库吗? 那取出来后我又要分开使用,怎么处理? 能直接存为数组的吗? ------ 我现在用的是第一种,得到数组后转为字符串存到数据库,...

茄子何
2013/05/11
480
1
Android以最省内存的方式读取本地资源的

方法一: /** * 获取本地图片并指定高度和宽度 */ public static Bitmap getNativeImage(String imagePath) { BitmapFactory.Options options = new BitmapFactory.Options(); options.inJu......

Thanks
2012/10/24
0
4

没有更多内容

加载失败,请刷新页面

加载更多

0011-如何在Hive & Impala中使用UDF

1.文档编写目的 本文档讲述如何开发Hive自定义函数(UDF),以及如何在Impala中使用Hive的自定义函数,通过本文档,您将学习到以下知识: 1.如何使用Java开发Hive的自定义函数 2.如何在Hive中...

Hadoop实操
11分钟前
1
0
toString();

package com.atguigu.java1; import java.util.Date; /** * toString()的使用: * * 1.java.lang.Object类中toString()定义如下: * public String toString() { return getClass().getName......

architect刘源源
21分钟前
0
3
不可不说的Java“锁”事

前言 Java提供了种类丰富的锁,每种锁因其特性的不同,在适当的场景下能够展现出非常高的效率。本文旨在对锁相关源码(本文中的源码来自JDK 8)、使用场景进行举例,为读者介绍主流锁的知识点...

Java干货分享
25分钟前
0
0
Java GoEasy 实现服务端推送和Web端推送

项目中需要消息推送,又想降低开发成本。Java服务器端推送,Web端接收推送信息。 具体需求: 需求一:系统框架实现全局异常捕获并录入日志表,实现实时推送消息到客户端页面展示。 需求二:系...

Gibbons
26分钟前
3
0
redis-集群

多个redis节点网络互联,数据共享 所有的节点都是一主一从(可以是多个从),其中从不提供服务,仅作为备用 不支持同时处理多个键(如mset/mget),因为redis需要把键均匀分布在各个节点上,...

chencheng-linux
31分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部