PHP 배열 메모리 사용량 분석
다음 방법은 얼마나 많은 메모리를 차지합니까?
list($appid,$openid) = ["testcontent","test"];
Test
$m0 = memory_get_usage(); $k = range(1,200000); $m1 = memory_get_usage(); echo round(($m1-$m0)/pow(1024,2),4) ."MB\n"; foreach ($k as $i){ $n1 = "kk$i"; $n2 = "tt$i"; list($$n1,$$n2) = [$i,$i*3]; } $m2 = memory_get_usage(); echo round(($m2-$m1)/pow(1024,2),4) ."MB\n"; $m1 = memory_get_usage(); foreach ($k as $i){ $n1 = "kk$i"; $n2 = "tt$i"; $$n1 = $i+time(); $$n2 = 2*time(); } $m2 = memory_get_usage(); echo round(($m2-$m1)/pow(1024,2),4) ."MB\n";
위 연산의 출력 결과는 다음과 같습니다.
27.9404MB 51.3041MB 9.1553MB
어레이가 차지하는 메모리가 일반적으로 할당된 콘텐츠보다 훨씬 크다는 것을 알 수 있습니다
Principle
In PHP는 숫자를 표현하기 위해 long 타입을 사용하고 int 타입은 없습니다. PHP는 변수 유형을 구별하지 않으며 int float char *와 같은 개념이 없습니다. PHP가 zend에 저장하는 변수를 살펴보겠습니다. PHP의 각 변수에는 해당 zval이 있습니다. Zval 구조는 Zend/zend.h에 정의되어 있습니다.
typedef struct _zval_struct zval; struct _zval_struct { /* Variable information */ zvalue_value value; /* The value 1 12字节(32位机是12,64位机需要8+4+4=16) */ zend_uint refcount__gc; /* The number of references to this value (for GC) 4字节 */ zend_uchar type; /* The active type 1字节*/ zend_uchar is_ref__gc; /* Whether this value is a reference (&) 1字节*/ };
PHP는 변수를 저장하기 위해 UNION 구조를 사용합니다. 즉, zvalue_value는 공용체이며 UNION 변수가 차지하는 메모리는 최대 멤버 데이터 공간에 따라 결정됩니다.
typedef union _zvalue_value { long lval; /* long value */ double dval; /* double value */ struct { /* string value */ char *val; int len; } str; HashTable *ht; /* hash table value */ zend_object_value obj; /*object value */ } zvalue_value;
가장 큰 멤버 데이터 공간은 struct str이고, 포인터는 *val에 대해 4바이트를 차지하고, INT는 4바이트를 차지하여 총 8바이트입니다.
struct zval은 8+4+1+1 = 14바이트를 차지합니다. 실제로 zval의 배열, 문자열 및 개체에는 Zend/zend_hash.h에 정의된 HashTable:
HashTable 구조가 필요합니다.
typedef struct _hashtable { uint nTableSize;//4 uint nTableMask;//4 uint nNumOfElements;//4 ulong nNextFreeElement;//4 Bucket *pInternalPointer; /* Used for element traversal 4*/ Bucket *pListHead;//4 Bucket *pListTail;//4 Bucket **arBuckets;//4 dtor_func_t pDestructor;//4 zend_bool persistent;//1 unsigned char nApplyCount;//1 zend_bool bApplyProtection;//1 #if ZEND_DEBUG int inconsistent;//4 #endif } HashTable;
HashTable 구조에는 39바이트가 필요하며 각 배열 요소는 Bucket 구조에 저장됩니다.
typedef struct bucket { ulong h; /* Used for numeric indexing 4字节 */ uint nKeyLength; /* The length of the key (for string keys) 4字节 */ void *pData; /* 4字节*/ void *pDataPtr; /* 4字节*/ struct bucket *pListNext; /* PHP arrays are ordered. This gives the next element in that order4字节*/ struct bucket *pListLast; /* and this gives the previous element 4字节 */ struct bucket *pNext; /* The next element in this (doubly) linked list 4字节*/ struct bucket *pLast; /* The previous element in this (doubly) linked list 4字节*/ char arKey[1]; /* Must be last element 1字节*/ } Bucket;
Bucket 구조에는 33바이트가 필요하며 키 길이가 4바이트보다 긴 부분은 Bucket 뒤에 요소 값이 추가됩니다. 또한 각 배열에는 arBuckets가 가리키는 버킷 포인터 배열이 할당됩니다. 추가된 각 요소마다 포인터가 필요하다고 말할 수는 없지만 실제 상황은 더 나쁠 수 있습니다. 이는 하나의 배열 요소가 54바이트를 차지할 것으로 계산되며 이는 위의 추정과 거의 동일합니다.
빈 배열은 최소 14(zval) + 39(HashTable) + 33(arBuckets) = 86바이트를 차지합니다. 변수로서 기호 테이블에 위치가 있어야 하며 배열 요소이기도 하므로 비어 있습니다. 설명하고 저장하려면 배열 변수 118바이트가 필요합니다. 공간적인 관점에서 볼 때 작은 배열은 평균적으로 더 비쌉니다. 물론 스크립트는 많은 수의 작은 배열로 채워지지 않으며 더 작은 공간 비용으로 프로그래밍 편의성을 얻을 수 있습니다. 그러나 배열을 컨테이너로 사용하면 이야기가 달라집니다. 실제 응용 프로그램에서는 요소가 많은 다차원 배열을 자주 접하게 됩니다. 예를 들어, 10k 요소의 1차원 배열은 약 540k의 메모리를 소비하는 반면 10k의 2차원 배열은 실제로 23M을 소비하므로 작은 배열은 실제로 그만한 가치가 없습니다.
위 내용은 PHP 배열 메모리 사용량 분석의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

AI Hentai Generator
AI Hentai를 무료로 생성하십시오.

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

뜨거운 주제











PHP 배열을 사용하여 차트와 통계 그래프를 생성하고 표시하는 방법 PHP는 강력한 데이터 처리 및 그래픽 생성 기능을 갖춘 널리 사용되는 서버측 스크립팅 언어입니다. 웹 개발에서 데이터의 차트와 통계 그래프를 표시해야 하는 경우가 종종 있는데, PHP 배열을 통해 이러한 기능을 쉽게 구현할 수 있습니다. 이 기사에서는 PHP 배열을 사용하여 차트와 통계 그래프를 생성 및 표시하는 방법을 소개하고 관련 코드 예제를 제공합니다. 필요한 라이브러리 파일 및 스타일 시트 소개 시작하기 전에 필요한 라이브러리 파일을 PHP 파일에 도입해야 합니다.

PHP 배열을 사용하여 동적 슬라이드쇼 및 그림 표시를 생성하는 방법 슬라이드쇼 및 그림 표시는 웹 디자인의 일반적인 기능이며 회전판 및 갤러리 표시와 같은 시나리오에서 자주 사용됩니다. 널리 사용되는 서버측 스크립팅 언어인 PHP는 데이터를 처리하고 동적 HTML 페이지를 생성하는 기능을 갖추고 있으며 동적 슬라이드쇼 및 그림 표시를 생성하는 데 매우 적합합니다. 이 기사에서는 PHP 배열을 사용하여 동적 슬라이드쇼와 그림 표시를 생성하는 방법을 소개하고 해당 코드 예제를 제공합니다. 이미지 데이터 준비 먼저 이미지 경로 데이터 세트를 준비해야 합니다.

PHP 배열 평균화 함수는 다음과 같습니다: 1. 배열에 있는 모든 값의 합계를 계산하는 데 사용되는 array_sum(), 평균을 계산하려면 배열에 있는 모든 값을 더한 다음 다음과 같이 나눌 수 있습니다. 배열 요소의 수 2, array_reduce(), 배열을 반복하고 초기 값으로 각 값을 계산하는 데 사용됩니다. 3. 배열의 평균을 반환하는 데 사용되는 array_mean(), 먼저 배열의 합계를 계산합니다. 배열 요소 수를 계산한 다음 합계를 배열 요소 수로 나누어 평균을 구합니다.

PHP 배열을 사용하여 사용자 로그인 및 권한 관리 기능을 구현하는 방법 웹 사이트를 개발할 때 사용자 로그인 및 권한 관리는 매우 중요한 기능 중 하나입니다. 사용자 로그인을 통해 당사는 사용자를 인증하고 웹사이트의 보안을 보호할 수 있습니다. 권한 관리는 사용자가 승인된 기능에만 액세스할 수 있도록 웹사이트에서 사용자의 운영 권한을 제어할 수 있습니다. 이 기사에서는 PHP 배열을 사용하여 사용자 로그인 및 권한 관리 기능을 구현하는 방법을 소개합니다. 이 프로세스를 보여주기 위해 간단한 예를 사용하겠습니다. 먼저 우리는 생성해야합니다

PHP 배열은 개발 과정에서 자주 사용되는 매우 일반적인 데이터 구조입니다. 그러나 데이터 양이 증가함에 따라 어레이 성능이 문제가 될 수 있습니다. 이 기사에서는 PHP 배열에 대한 몇 가지 성능 최적화 기술을 살펴보고 구체적인 코드 예제를 제공합니다. 1. 적절한 데이터 구조 사용 PHP에는 일반 배열 외에도 SplFixedArray, SplDoublyLinkedList 등과 같은 다른 데이터 구조가 있는데, 이는 특정 상황에서 일반 배열보다 더 나은 성능을 발휘할 수 있습니다.

PHP 배열 키-값 쌍은 키와 해당 값으로 구성된 데이터 구조입니다. 키는 배열 요소의 식별자이고 값은 키와 관련된 데이터입니다. 키-값 쌍을 사용하여 키를 식별자로 사용하여 데이터를 저장하고 액세스할 수 있으므로 배열의 요소를 보다 쉽게 작동하고 관리할 수 있으므로 프로그램 개발이 더욱 유연하고 효율적이 됩니다.

PHP 배열을 2차원에서 1차원 배열로 변환하는 방법: 1. 루프 순회를 사용하여 2차원 배열을 탐색하고 각 요소를 1차원 배열에 추가합니다. 2. "array_merge" 함수를 사용하여 여러 항목을 병합합니다. 2차원 배열을 "array_merge" 함수에 매개변수로 전달하여 1차원 배열로 변환합니다. 3. "array_reduce" 함수를 사용하면 배열의 모든 값을 처리할 수 있습니다. 콜백 함수를 통해 최종적으로 결과를 반환합니다.

PHP에서 배열을 결정하는 방법에는 여러 가지가 있습니다. 1. 모든 유형의 배열에 적합한 count() 함수를 사용합니다. 그러나 전달된 매개변수가 배열이 아닌 경우 count() 함수는 0을 반환합니다. 2. 다른 프로그래밍 언어와의 호환성을 유지하는 데 더 많이 사용되는 sizeof() 함수를 사용합니다. 함수, 루프를 사용하여 배열을 순회함으로써 순회할 때마다 카운터가 1씩 증가하고 최종적으로 배열의 길이를 얻습니다. 사용자 정의 기능은 실제 필요에 따라 수정 및 확장될 수 있어 더욱 유연해집니다.
