실제 인덱싱 된 배열을 원하면 SplFixedArray을 사용하십시오. 더 적은 메모리를 사용합니다. 또한 PHP 5.3에는 더 나은 가비지 수집기가 있습니다.
그 외에도 PHP는보다 신중하게 작성된 C/C++ 코드보다 많은 메모리를 사용합니다.
메모리 사용량 1024 × 1024의 정수 어레이 :
- 표준 배열 : 218,756,848
- SplFixedArray : 92,914,208
memory_get_peak_usage()
$array = new SplFixedArray(1024 * 1024); // array();
for ($i = 0; $i < 1024 * 1024; ++$i)
$array[$i] = 0;
echo memory_get_peak_usage();
참고로 측정 한 것과 같은 배열 64 비트 정수를 사용하는 C는 8M이됩니다.
다른 사람들이 제안했듯이 데이터를 문자열로 묶을 수 있습니다. 이 속도는 더 느리지 만 훨씬 더 많은 메모리가 효율적입니다. 8 개 비트 값을 사용하는 경우가 매우 쉽다 :
$x = str_repeat(chr(0), 1024*1024);
$x[$i] = chr($v & 0xff); // store value $v into $x[$i]
$v = ord($x[$i]); // get value $v from $x[$i]
여기서 메모리에만 1.5MB 관한 것이다 (다만,이 정수 문자열 배열 PHP의 전체 오버 헤드를 고려할 때).
재미있게하기 위해 1024x1024 8 비트 정수를 만든 다음이를 한 번 반복하는 간단한 벤치 마크를 만들었습니다. 팩 버전은 모두 ArrayAccess
을 사용하여 사용자 코드가 동일하게 보입니다.
mem write read
array 218M 0.589s 0.176s
packed array 32.7M 1.85s 1.13s
packed spl array 13.8M 1.91s 1.18s
packed string 1.72M 1.11s 1.08s
포장 된 배열 (서명 된 데이터를 처리 방지하기 위해 7 바이트 포장) 기본 64 비트 정수를 사용하여 압축 문자열은 ord
및 chr
을 사용했다. 분명히 구현 세부 사항과 컴퓨터 사양은 약간의 것들에 영향을 미치지 만 비슷한 결과를 기대합니다.
배열이 6 배 빨라지면서 다음 최상의 대안으로 125x 메모리를 사용했습니다. 당신이 기억이 부족하다면 분명히 속도는 무의미하다. (ArrayAccess
클래스없이 직접 팩 문자열을 사용한 경우 기본 배열보다 3 배 느렸다.)
간단히 요약하자면, 속도가 걱정된다면이 데이터를 처리하기 위해 순수 PHP 이외의 것을 사용할 것입니다.
배열은 실제로 PHP에서 메모리가 많이 필요합니다 (실제로는 사전이므로). 만약 당신이 몇 가지 (많은!) 속도를 포기할 수 있습니다 [C와 같은 이진 배열을 가짜 수 있습니다] (http://stackoverflow.com/questions/5505124/cheating-php-integers/5505643#5505643), 또한 2D 구조 그렇 겠지. 하지만 어쩌면 당신은 정말로 [HipHop PHP to C++ 컴파일러] (https://github.com/facebook/hiphop-php/wiki/)를 조사하고 싶을 것입니다. – mario
PHP의 모든 변수에는 이와 관련된 오버 헤드가 있습니다. 변수의 값을 저장해야 할뿐만 아니라 변수의 이름, 유형 등을 저장해야 할뿐만 아니라 간단한'$ x [1] = 2; '라고해도 큰 따옴표가 있습니다. –
PHP 확장 기능은 무엇입니까? – Bytemain