2013-06-20 2 views
4

나는 PHP 5.3 스크립트로 메모리 할당에 의문을 가지고 있습니다.) (정적 var 및 함수 : PHP에서 메모리 할당

for($i = 0; $i < 200000; $i++) { 
    echo "Pre-data1 Test:\n\t" . memory_get_usage(true) . "\n"; 
    Test::getTestData1(); 
    echo "Post-data1 Test:\n\t" . memory_get_usage(true) . "\n"; 
} 

for($i = 0; $i < 200000; $i++) { 
    echo "Pre-data2 Test:\n\t" . memory_get_usage(true) . "\n"; 
    Test::getTestData2(); 
    echo "Post-data2 Test:\n\t" . memory_get_usage(true) . "\n"; 
} 

내가 호출이 :: getTestData1을 테스트 할 수 있다고 가정 수 있습니다

class MyData { 
    private static $data = null; 

    public static function getData() { 
     if(self::$data == null) 
      self::$data = array(1,2,3,4,5,); 
     return self::$data; 
    } 
} 

class Test { 
    private static $test_data = null; 

    public static function getTestData1() { 
     if(self::$test_data==null) { 
      self::$test_data = MyData::getData(); 
      self::$test_data[] = 6; 
     } 
     return self::$test_data; 
    } 

    public static function getTestData2() { 
     $test = MyData::getData(); 
     $test[] = 6; 
     return $test; 
    } 
} 

그리고 간단한 test.php 스크립트 : 당신이 추천 정적 클래스 (을 MyData 및 테스트)가 상상 Test :: getTestData2()는 함수 반환시 $ test (정적 변수의 복사본)를 파기하므로 2 번째 정적 변수에 대한 메모리를 할당하므로 두 번째 호출은 "메모리 비싸지 않다".

하지만이 test.php 스크립트를 실행하는 경우, memory_get_usage는 테스트 :: getTestData1() 및 테스트 :: getTestData2 (에 대해 동일한 값)

왜 표시됩니다?

답변

0

잘못된 방식으로 메모리 사용을 테스트하고 있습니다. memory_get_usage(false);을 사용하면 스크립트에서 실제로 사용되는 메모리를 확보 할 수 있습니다. memory_get_usage(true);은 System에서 할당 한 메모리를 반환하기 만하며 작은 스크립트에서는 항상 동일합니다.

+1

메모리 사용을 테스트하는 동안 또 다른 유용한 기능 : http://php.net/manual/en/function.memory-get-peak-usage.php – Pinoniq

+0

감사합니다 Pinoniq! 이제 Test :: getTestData2()가 메모리 측면에서 가장 비싸지 않다는 것을 입증 할 수 있습니다. – Ligio

+0

비싸지는 않습니다. 궁극적으로 나쁜 프로그래밍은 애플리케이션에서 병목 현상이 될 수 있습니다. 그래서 저는 이런 종류의 최적화에 그다지 집중하지 않을 것입니다. – Pinoniq