2013-06-20 38 views
4

我对php 5.3脚本的内存分配有疑问。 想象一下,你有2个静态类(迈德特和测试)这样的:静态变量和函数:内存分配在php

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的:

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()将为2个静态变量分配内存,而Test :: getTestData2()将在函数返回时销毁$ test(静态变量的副本),所以第二次调用的内存更少。

但是,如果我运行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