search
HomeBackend DevelopmentPHP TutorialAnalysis of how big a PHP array should be_PHP Tutorial
Analysis of how big a PHP array should be_PHP TutorialJul 21, 2016 pm 03:44 PM
phpsuperioranalyzereactionarrayOperationconductPass

Although generally performing a large number of array operations in PHP may reflect programming design problems to a certain extent, it is necessary to roughly estimate the memory occupied by the array.
First feel the memory occupied by an integer array of 1000 elements:

Copy the code The code is as follows:

echo memory_get_usage () . “n”;
$a = Array();
for ($i=0; $i$a[$i] = $i + $ i;
}
echo memory_get_usage() . “n”;
for ($i=1000; $i$a[$i] = $i + $i;
}
echo memory_get_usage() . “n”;

The output is:
58176
162956
267088
You can know about 1000 An integer array of elements requires 100k of memory, and each element occupies an average of 100 bytes. The whole thing in pure C only requires 4k. The results returned by memory_get_usage() are not all occupied by arrays, but also include some structures allocated by PHP itself. The arrays generated by built-in functions may be closer to the real space:
Copy code The code is as follows:

echo “init mem: ” . memory_get_usage() . “n”;
$a = array_fill(0, 10000, 1 );
echo “10k elements: ” . memory_get_usage() . “, system: ” . memory_get_usage(true) . “n”;
$b = array_fill(0, 10000, 1);
echo "10k elements: " . memory_get_usage() . ", system: " . memory_get_usage(true) . "n";

get:
init mem: 58468
10k elements: 724696 , system: 786432
10k elements: 1390464, system: 1572864
From this result, it seems that one array element only takes up about 60 bytes. Let’s look at the C structure of the array. Array variables in PHP first require a zval structure:
Copy the code The code is as follows:

struct _zval_struct {
zvalue_value value;
zend_uint refcount__gc;
zend_uchar type;
zend_uchar is_ref__gc; >

Copy code

The code is as follows:
typedef union _zvalue_value { long lval; double dval;
struct {
char *val;
int len;
} str;
HashTable *ht;
zend_object_value obj;
} zvalue_value;


usually zval The structure requires 8+6=14 bytes. Each variable in PHP has a corresponding zval, but arrays, strings and objects also require additional storage structures, and the array is a HashTable:


Copy code

The code is as follows:
typedef struct _hashtable { uint nTableSize; uint nTableMask;
uint nNumOfElements;
ulong nNextFreeElement;
Bucket *pInternalPointer;
Bucket *pListHead;
Bucket *pListTail;
Bucket **arBuckets;
dtor_func_t pDestructor; ;
zend_bool bApplyProtection;
} HashTable;


The HashTable structure requires 40 bytes, and each array element is stored in the Bucket structure:



Copy code
The code is as follows:

typedef struct bucket { ulong h; uint nKeyLength; void *pData; void * pDataPtr;
struct bucket *pListNext;
struct bucket *pListLast;
struct bucket *pNext;
struct bucket *pLast;
char arKey[1];
} Bucket;


The Bucket structure requires 36 bytes. The part with a key length longer than four bytes is appended to the end of the Bucket. The element value is likely to be a zval structure. In addition, each array will be allocated a Bucket pointer array pointed to by arBuckets. Although it cannot be said that each additional element requires a pointer, the actual situation may be worse. This calculates that one array element will occupy 54 bytes, which is not far from the above estimate.
An empty array will occupy at least 14(zval) + 40(HashTable) + 32(arBuckets) = 86 bytes. As a variable, it should have a position in the symbol table and is also an array element, so an empty array Variables require 118 bytes to describe and store. From a space perspective, small arrays are more expensive on average. Of course, a script will not be filled with a large number of small arrays, and programming convenience can be obtained at a smaller space cost.
But if you use an array as a container, it is a different story. In practical applications, you often encounter multi-dimensional arrays with many elements. For example, a one-dimensional array of 10k elements consumes approximately 540k of memory, while a two-dimensional array of 10k The array actually consumes 23M, and small arrays are really not worth it.

www.bkjia.comtruehttp: //www.bkjia.com/PHPjc/320469.htmlTechArticleAlthough usually a large number of array operations in PHP may reflect programming design problems to a certain extent, but roughly It is necessary to estimate the memory occupied by the array. First of all, I feel...
Statement
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
php怎么把负数转为正整数php怎么把负数转为正整数Apr 19, 2022 pm 08:59 PM

php把负数转为正整数的方法:1、使用abs()函数将负数转为正数,使用intval()函数对正数取整,转为正整数,语法“intval(abs($number))”;2、利用“~”位运算符将负数取反加一,语法“~$number + 1”。

php怎么实现几秒后执行一个函数php怎么实现几秒后执行一个函数Apr 24, 2022 pm 01:12 PM

实现方法:1、使用“sleep(延迟秒数)”语句,可延迟执行函数若干秒;2、使用“time_nanosleep(延迟秒数,延迟纳秒数)”语句,可延迟执行函数若干秒和纳秒;3、使用“time_sleep_until(time()+7)”语句。

php字符串有没有下标php字符串有没有下标Apr 24, 2022 am 11:49 AM

php字符串有下标。在PHP中,下标不仅可以应用于数组和对象,还可应用于字符串,利用字符串的下标和中括号“[]”可以访问指定索引位置的字符,并对该字符进行读写,语法“字符串名[下标值]”;字符串的下标值(索引值)只能是整数类型,起始值为0。

php怎么除以100保留两位小数php怎么除以100保留两位小数Apr 22, 2022 pm 06:23 PM

php除以100保留两位小数的方法:1、利用“/”运算符进行除法运算,语法“数值 / 100”;2、使用“number_format(除法结果, 2)”或“sprintf("%.2f",除法结果)”语句进行四舍五入的处理值,并保留两位小数。

php怎么根据年月日判断是一年的第几天php怎么根据年月日判断是一年的第几天Apr 22, 2022 pm 05:02 PM

判断方法:1、使用“strtotime("年-月-日")”语句将给定的年月日转换为时间戳格式;2、用“date("z",时间戳)+1”语句计算指定时间戳是一年的第几天。date()返回的天数是从0开始计算的,因此真实天数需要在此基础上加1。

php怎么读取字符串后几个字符php怎么读取字符串后几个字符Apr 22, 2022 pm 08:31 PM

在php中,可以使用substr()函数来读取字符串后几个字符,只需要将该函数的第二个参数设置为负值,第三个参数省略即可;语法为“substr(字符串,-n)”,表示读取从字符串结尾处向前数第n个字符开始,直到字符串结尾的全部字符。

php怎么替换nbsp空格符php怎么替换nbsp空格符Apr 24, 2022 pm 02:55 PM

方法:1、用“str_replace(" ","其他字符",$str)”语句,可将nbsp符替换为其他字符;2、用“preg_replace("/(\s|\&nbsp\;||\xc2\xa0)/","其他字符",$str)”语句。

php怎么查找字符串是第几位php怎么查找字符串是第几位Apr 22, 2022 pm 06:48 PM

查找方法:1、用strpos(),语法“strpos("字符串值","查找子串")+1”;2、用stripos(),语法“strpos("字符串值","查找子串")+1”。因为字符串是从0开始计数的,因此两个函数获取的位置需要进行加1处理。

See all articles

Hot AI Tools

Undresser.AI Undress

Undresser.AI Undress

AI-powered app for creating realistic nude photos

AI Clothes Remover

AI Clothes Remover

Online AI tool for removing clothes from photos.

Undress AI Tool

Undress AI Tool

Undress images for free

Clothoff.io

Clothoff.io

AI clothes remover

AI Hentai Generator

AI Hentai Generator

Generate AI Hentai for free.

Hot Article

R.E.P.O. Energy Crystals Explained and What They Do (Yellow Crystal)
2 weeks agoBy尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Best Graphic Settings
2 weeks agoBy尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. How to Fix Audio if You Can't Hear Anyone
3 weeks agoBy尊渡假赌尊渡假赌尊渡假赌

Hot Tools

Zend Studio 13.0.1

Zend Studio 13.0.1

Powerful PHP integrated development environment

SublimeText3 English version

SublimeText3 English version

Recommended: Win version, supports code prompts!

Dreamweaver Mac version

Dreamweaver Mac version

Visual web development tools

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

Powerful PHP integrated development environment

Dreamweaver CS6

Dreamweaver CS6

Visual web development tools