나는 PHP 5.3.9에서 코드를 테스트했다. 이렇게하려면 내가 array()
에 []
을 번역했고, 나 또한 당신의 라인 # 12 수정했다 : $a=new MyTest($size)
에서 $mytest=new MyTest($size)
에 (BTW, 생성자의 인수가 자동으로 무시됩니다 재미를). 당신 5000000의와,
echo "================".PHP_EOL;
echo "Testing Function".PHP_EOL;
for($size = 1000; $size < 1000000; $size *= 2) {
$start = milliseconds();
for ($a=array(), $i=0;$i<$size;$i++) {
my_push($a);
}
$end = milliseconds();
echo "Array Size $size".PHP_EOL;
echo $end - $start . " milliseconds to perform".PHP_EOL;
echo "memory usage: ".memory_get_usage()." , real: ".memory_get_usage(true).PHP_EOL;
}
function my_push(&$a)
{
$a[] = array(new stdClass());
}
나도 같은 지점에서 루프로 메모리 사용량 라인을 추가 (보다 일관된 메모리 로그를 얻기 위해) 객체의 경우 후 unset($mytest);
을 추가하고, 또한 대체 : 나는이 코드를 추가 1000000은 RAM이 2GB 밖에 없기 때문입니다. 이것은 내가 가진 것입니다 : 당신이 볼 수 있듯이
Testing Objects
Array Size 1000
2 milliseconds to perform
memory usage: 1666376 , real: 1835008
Array Size 2000
5 milliseconds to perform
memory usage: 2063280 , real: 2097152
Array Size 4000
10 milliseconds to perform
memory usage: 2857008 , real: 2883584
Array Size 8000
19 milliseconds to perform
memory usage: 4444456 , real: 4718592
Array Size 16000
44 milliseconds to perform
memory usage: 7619392 , real: 8126464
Array Size 32000
103 milliseconds to perform
memory usage: 13969256 , real: 14417920
Array Size 64000
239 milliseconds to perform
memory usage: 26668936 , real: 27262976
Array Size 128000
588 milliseconds to perform
memory usage: 52068368 , real: 52690944
Array Size 256000
1714 milliseconds to perform
memory usage: 102867104 , real: 103546880
Array Size 512000
5452 milliseconds to perform
memory usage: 204464624 , real: 205258752
================
Testing Array
Array Size 1000
1 milliseconds to perform
memory usage: 18410640 , real: 20709376
Array Size 2000
4 milliseconds to perform
memory usage: 18774760 , real: 20709376
Array Size 4000
7 milliseconds to perform
memory usage: 19502976 , real: 20709376
Array Size 8000
13 milliseconds to perform
memory usage: 20959360 , real: 21233664
Array Size 16000
29 milliseconds to perform
memory usage: 23872176 , real: 24379392
Array Size 32000
61 milliseconds to perform
memory usage: 29697720 , real: 30146560
Array Size 64000
124 milliseconds to perform
memory usage: 41348856 , real: 41943040
Array Size 128000
280 milliseconds to perform
memory usage: 64651088 , real: 65273856
Array Size 256000
534 milliseconds to perform
memory usage: 111255536 , real: 111935488
Array Size 512000
1085 milliseconds to perform
memory usage: 204464464 , real: 205258752
================
Testing Function
Array Size 1000
357 milliseconds to perform
memory usage: 18410696 , real: 22544384
Array Size 2000
4 milliseconds to perform
memory usage: 18774768 , real: 22544384
Array Size 4000
9 milliseconds to perform
memory usage: 19503008 , real: 22544384
Array Size 8000
17 milliseconds to perform
memory usage: 20959392 , real: 22544384
Array Size 16000
36 milliseconds to perform
memory usage: 23872208 , real: 24379392
Array Size 32000
89 milliseconds to perform
memory usage: 29697720 , real: 30146560
Array Size 64000
224 milliseconds to perform
memory usage: 41348888 , real: 41943040
Array Size 128000
529 milliseconds to perform
memory usage: 64651088 , real: 65273856
Array Size 256000
1587 milliseconds to perform
memory usage: 111255616 , real: 111935488
Array Size 512000
5244 milliseconds to perform
memory usage: 204464512 , real: 205258752
는 함수 호출 내부 배열에 추가하면 원래 메서드 호출 내에서 그 일을 거의만큼 비용 (와 같은 비선형 거동이있다). 한 가지는 확실히 말할 수 있습니다 :
그것은 CPU 시간을 먹는 함수 호출입니다!
비선형 동작에 관해서는 특정 임계 값 이상에서만 실제로 분명해집니다. (불완전 gargabe 수집 이것은 "일반 배열"이 로그에 "배열 함수 내에서"케이스 사이에서만 명백하므로) 세 경우 모두가 동일한 메모리 동작 동안, 그것은 "메소드 내부 배열"이고 " 함수 내부에 배열 "같은 실행 시간 동작을 갖는 경우를 나타냅니다. 즉, 비선형 적으로 시간이 증가하는 것은 함수 호출 자체를 의미합니다. 함수 호출시 주변에있는 데이터의
양이 기간에 영향을 미친다 :이라고 할 수있는 날 것으로 보인다.이를 확인하려면
나는 모든
$a[0]
와
$a[]
모든 1000000 교체 5000000 (비슷한 총 실행 시간을 얻기 위해)이 출력을 얻을 : 시간이 지금은 거의 완벽하게 선형 얼마나
Testing Objects
Array Size 1000
2 milliseconds to perform
memory usage: 1302672 , real: 1572864
Array Size 2000
4 milliseconds to perform
memory usage: 1302672 , real: 1572864
Array Size 4000
8 milliseconds to perform
memory usage: 1302672 , real: 1572864
Array Size 8000
15 milliseconds to perform
memory usage: 1302672 , real: 1572864
Array Size 16000
31 milliseconds to perform
memory usage: 1302672 , real: 1572864
Array Size 32000
62 milliseconds to perform
memory usage: 1302672 , real: 1572864
Array Size 64000
123 milliseconds to perform
memory usage: 1302672 , real: 1572864
Array Size 128000
246 milliseconds to perform
memory usage: 1302672 , real: 1572864
Array Size 256000
493 milliseconds to perform
memory usage: 1302672 , real: 1572864
Array Size 512000
985 milliseconds to perform
memory usage: 1302672 , real: 1572864
Array Size 1024000
1978 milliseconds to perform
memory usage: 1302672 , real: 1572864
Array Size 2048000
3965 milliseconds to perform
memory usage: 1302672 , real: 1572864
Array Size 4096000
7905 milliseconds to perform
memory usage: 1302672 , real: 1572864
================
Testing Array
Array Size 1000
1 milliseconds to perform
memory usage: 1302464 , real: 1572864
Array Size 2000
3 milliseconds to perform
memory usage: 1302464 , real: 1572864
Array Size 4000
5 milliseconds to perform
memory usage: 1302464 , real: 1572864
Array Size 8000
10 milliseconds to perform
memory usage: 1302464 , real: 1572864
Array Size 16000
20 milliseconds to perform
memory usage: 1302464 , real: 1572864
Array Size 32000
40 milliseconds to perform
memory usage: 1302464 , real: 1572864
Array Size 64000
80 milliseconds to perform
memory usage: 1302464 , real: 1572864
Array Size 128000
161 milliseconds to perform
memory usage: 1302464 , real: 1572864
Array Size 256000
322 milliseconds to perform
memory usage: 1302464 , real: 1572864
Array Size 512000
646 milliseconds to perform
memory usage: 1302464 , real: 1572864
Array Size 1024000
1285 milliseconds to perform
memory usage: 1302464 , real: 1572864
Array Size 2048000
2574 milliseconds to perform
memory usage: 1302464 , real: 1572864
Array Size 4096000
5142 milliseconds to perform
memory usage: 1302464 , real: 1572864
================
Testing Function
Array Size 1000
1 milliseconds to perform
memory usage: 1302464 , real: 1572864
Array Size 2000
4 milliseconds to perform
memory usage: 1302464 , real: 1572864
Array Size 4000
6 milliseconds to perform
memory usage: 1302464 , real: 1572864
Array Size 8000
14 milliseconds to perform
memory usage: 1302464 , real: 1572864
Array Size 16000
26 milliseconds to perform
memory usage: 1302464 , real: 1572864
Array Size 32000
53 milliseconds to perform
memory usage: 1302464 , real: 1572864
Array Size 64000
105 milliseconds to perform
memory usage: 1302464 , real: 1572864
Array Size 128000
212 milliseconds to perform
memory usage: 1302464 , real: 1572864
Array Size 256000
422 milliseconds to perform
memory usage: 1302464 , real: 1572864
Array Size 512000
844 milliseconds to perform
memory usage: 1302464 , real: 1572864
Array Size 1024000
1688 milliseconds to perform
memory usage: 1302464 , real: 1572864
Array Size 2048000
3377 milliseconds to perform
memory usage: 1302464 , real: 1572864
Array Size 4096000
6814 milliseconds to perform
memory usage: 1302464 , real: 1572864
참고. 물론 배열 크기는 1로 고정되어 있습니다. 세 경우의 실행 시간의 차이가 이전보다 덜 두드러진 점에 유의하십시오. 가장 안쪽에있는 작업은 모든 경우에서 동일하다는 것을 기억하십시오.
나는이 모든 것을 설명하려고하지는 않는다. (함수 호출에 대한 gargabe 콜렉션? 메모리 조각화? ...?).하지만 나는 모든 사람들에게 유용한 정보를 수집했다고 생각한다. 너무.
의심의 여지가 있지만 배열 문제입니다,하지만 당신은 객체 내부에 그 배열을 구축하고 있기 때문에 OOP 오버 헤드가 될 수 있습니다 - 많은 OOP 오버 헤드. 일시적으로 해당 개체 구성원을 표준 전역 변수로 바꾸면 성능이 전혀 변하지 않습니까? –
이 질문을 실제 문제로 줄이시고 전체 prggmr 항목을 남겨 둘 수 있습니까? 그것은 질문을 이해하기 어렵게 만듭니다. – NikiC
@MarcB 변경 사항이 있지만 중요한 변경 사항은 아닙니다 (true를 단지'$ this -> _ event_history [] = [true]''로 저장하면 10 초 후에 초당 9532가 생성됩니다) @NikiC Do – Nick