<?phpfunction test()
{
$useinside = memory_get_usage();
$array1 = range(1 , 100); foreach($array1 as $k)
{
$array2 = range(1 , 100);
foreach($array2 as $v)
{
$v = $v * 10000;
}
unset($array2 , $v);
}
unset($array1 , $k);
$useinside2 = memory_get_usage();
echo 'in function use '.$useinside2 .'--'. $useinside.'('.($useinside2 - $useinside).')<br />';
unset($useinside2 , $useinside);
 }function test1()
{
$useinside = memory_get_usage();
$array1 = range(1 , 100); foreach($array1 as $k)
{
$array2 = range(1 , 100);
foreach($array2 as $v)
{
$v = $v * 10000;
}
}
$useinside2 = memory_get_usage();
echo 'in function use '.$useinside2 .'--'. $useinside.'('.($useinside2 - $useinside).')<br />';
unset($useinside2 , $useinside);
 }function microtime_float()
{
    list($usec, $sec) = explode(" ", microtime());
    return ((float)$usec + (float)$sec);
}
 $use = memory_get_usage();
 echo 'init:'.$use.'<br />';
 $time = microtime_float();
 test();
 $use2 = memory_get_usage();
 echo 'end:'.$use2.'<br />';
 $time2 = microtime_float(); echo 'use '.($use2 - $use).'<br />';
 echo 'time '.($time2 - $time).'<br />'; $use = memory_get_usage();
 echo 'init:'.$use.'<br />';
 $time = microtime_float();
 test1();
 $use2 = memory_get_usage();
 echo 'end:'.$use2.'<br />';
 $time2 = microtime_float(); echo 'use '.($use2 - $use).'<br />';
 echo 'time '.($time2 - $time).'<br />'; $use = memory_get_usage();
 echo 'init:'.$use.'<br />';
 $time = microtime_float();
 test();
 $use2 = memory_get_usage();
 echo 'end:'.$use2.'<br />';
 $time2 = microtime_float(); echo 'use '.($use2 - $use).'<br />';
 echo 'time '.($time2 - $time).'<br />';
?>
执行出来的结果 大牛可以贴出来 然后分析下为什么会有这些差别
最后请得出一个结论 是采用哪种方式好, 那样才是正确计算内存使用情况的方法.

解决方案 »

  1.   


    init:43948
    in function use 44260--44180(80)              [1]
    end:44180
    use 232
    time 0.0056118965148926
    init:44328
    in function use 59416--44328(15088)         [2]   
    end:44328
    use 0
    time 0.0041630268096924                      
    init:44328
    in function use 44408--44328(80)
    end:44328
    use 0
    time 0.0043032169342041我的疑惑主要在 1和2 的差别 以及 两个代码块执行时间上的问题,想必这个应该涉及到php 内核了. 谁解释下?
      

  2.   

    我觉得应该这样测试
     $use = memory_get_usage();
     echo 'init:'.$use.'<br />';
     $time = microtime_float();
     test1();//执行后,修改为test();,比较两次结果,更公平
     $use2 = memory_get_usage();
     echo 'end:'.$use2.'<br />';
      

  3.   


    第一次出来的 使用数据 是包含了系统初始化的 所以数据是不准确的. 但是 第二次调用 test1 和第三次调用 test 我认为系统资源是一样的. 两者再调换位置是没有差别的我现在的疑问是 两者的内存使用的差别 以及 memory_get_usage 到底是怎么计算的. 以及两块的执行时间  按照道理 应该有快有慢  而且是稳定且明显的 为什么执行的结果却不是这样. 
      

  4.   


    你test1里没有unset($array1 , $k);
    这个就是造成1和2的差别的原因啊关于时间,现在的操作系统都是分时的,时间上的细微差别不说明问题。
      

  5.   

    init:43948
    in function use 44260--44180(80)              [1]  这里 44180 说明调用函数前 其实 内存已经应该降到了 44180 所以函数调用结束的时候  获得的内存使用 仍然是 44180 因为 函数结束 php 自动释放了 函数里面的局部变量 (从后面的数据也可以看出来  在调用函数前 内存使用已经是 44180 了 而 开始的 43948 和这个之间的差 就是  $time = microtime_float(); 这段代码的内存开销)
    end:44180
    use 232
    time 0.0056118965148926
    init:44328
    in function use 59416--44328(15088)         [2]   
    end:44328
    use 0
    time 0.0041630268096924                      
    init:44328
    in function use 44408--44328(80)
    end:44328
    use 0
    time 0.0043032169342041其实这个结果已经很明显了
    对于 unset 使用 可以降低峰值的内存开销代码应该改下 
    $use = memory_get_usage();
     test();
     $use2 = memory_get_usage();
      

  6.   

    对于我刚才说的:
     其实这个结果已经很明显了
    对于 unset 使用 可以降低峰值的内存开销 
    这个结论我觉得又有待推敲. 两者在执行的时候  其实 test() 里面的 峰值内存应该和test1()一致 只是 test() 里面自己unset 了 然后再测试内存 肯定降下来了.那么 unset 在代码里面降低峰值内存的作用当且仅当后续有代码执行,能暂时在当前代码块内部降低内存占用而已....
      

  7.   

    所以 函数 末尾的 unset 是对于降低内存使用是没有任何意义的.  但是在长的代码块中  不使用的变量 unset 掉 的确是有好处的.
      

  8.   

    usb编程中的usage怎么定义的, 急急急
      

  9.   

    我想问下那个usb编程中的usage是怎么定义的