2012-09-27 1 views
2

다음 코드가 두 개 있습니다.while (1) 대();에 대한 이상한 메모리 사용

1 : 1626464

2 : 1626656

누군가가 (2) 사이에 차이를 exaplain 수 :

$i = 0; 
for(;;) 
{ 
    $i++; 

    echo "big text for memory usage "; 
    if ($i == 50000) 
    break; 
} 

echo "<br />" . memory_get_usage(); 

그것은마다 에코

$i = 0; 
while(1) 
{ 
    $i++; 

    echo "big text for memory usage "; 
    if ($i == 50000) 
    break; 
} 

echo "<br />" . memory_get_usage(); 

그것은마다 에코 다른 메모리 사용법? 그들이 너무 작아도 ...

답변

2

구현 세부 사항입니다. for 루프를 사용하면 PHP는 세 개의 포인터를 저장하기 위해 일부 공간을 사용하는데, 하나는 초기화를위한 것이고 다른 하나는 증가를위한 것이고 다른 하나는 정지 조건을위한 것이다. 64 비트 시스템을 사용하는 경우 표시되는 비트 수가 64 * 3 = 192입니다. 물론, 실제 코드를 보지 않고 내가 옳은지 말할 수 없습니다.

+0

예이 시스템은 64 비트 시스템입니다. 나는 당신이 맞다고 생각하고 여분의 192 비트가 여기에서옵니다. 고마워, 그냥 호기심이었다! – Cosmin

3

보고있는 메모리 차이는 무시할 정도로 적어 걱정할 필요가 없습니다. 두 루프가 컴파일되는 방식은 메모리 사용에 영향을주지 않아야하지만 런타임 속도에 영향을 미칠 수 있습니다 (그래도 무시할 수 있음).

예 : while(1) : 컴파일러는 1이 true인지 확인합니다. 그렇지 않은 경우 루프의 끝으로 이동합니다. 루프 인 경우 루프의 내용을 처리합니다.

for(;;) : 표준 for -loop은 세 가지를 수행합니다. 그것은 건너 뛴 반복자를 정의하고, 반복자가 조건을 충족하는지 검사하고, 건너 뛰고 본문 내용을 실행 한 다음 반복자를 증가시키고 조건 확인으로 다시 이동합니다. 점프는 여전히 모든 위치에 있지만 코드는 각각에서 아무 것도하지 않습니다 (따라서 "무한 루프"- 수동으로 중단 할 때까지). 잠재적 인 답변에 대한 순수한 추측으로

for -loop가이 메모리에 아주 약간의 인상이 될 수없는 이유로 - 투 -

이 일을 해야하는 방식의 때문에 - 정의/관리 반복자와. PHP는 사용하지 않는 경우에도이 반복자와 가비지 콜렉션을 수용 할 수 있도록 아주 작은 공간을 미리 할당 할 수 있습니다.

+0

네, 그들이하는 일을 알고 있습니다. 단지 192 비트가 어디에서 왔는지 알고 싶습니다. Cygal이 나에게 대답을 주었다고 생각합니다. – Cosmin