php减少内存,php – 减少数组和SplFixedArray的内存使用量

我在array()和SplFixedArray()之间做了一些基准测试,我遇到了奇怪的行为.首先,看看我的简单测试(它实际上只是来自互联网的编辑版本,抱歉,我现在找不到原始资源):

function formatMemoryUsage($usage) {

$unit = array(' B', 'kB', 'MB', 'GB', 'TB');

$factor = floor((strlen($usage) - 1) / 3);

return sprintf('%.2f %s (%d bytes) ', $usage / pow(1024, $factor), $unit[$factor], $usage);

}

for($size = 1000; $size < 100000; $size *= 2) {

echo PHP_EOL . '> Testing size: ' . number_format($size) . PHP_EOL;

echo ' Array()' . PHP_EOL;

for($s = microtime(true), $m = memory_get_usage(true), $container = Array(), $i = 0; $i < $size; $i++) $container[$i] = null;

echo ' - Write - time : ' . str_pad(microtime(true) - $s, 20, '0') . ' - memory: ' . formatMemoryUsage(memory_get_usage(true) - $m) . PHP_EOL;

$s = microtime(true);

foreach ($container as $key => $value) {

$void = $value;

}

echo ' - Read - time : ' . str_pad(microtime(true) - $s, 20, '0') . PHP_EOL;

unset($container);

echo ' SplFixedArray()' . PHP_EOL;

for($s = microtime(true), $m = memory_get_usage(true), $container = new SplFixedArray($size), $i = 0; $i < $size; $i++) $container[$i] = null;

echo ' - Write - time : ' . str_pad(microtime(true) - $s, 20, '0') . ' - memory: ' . formatMemoryUsage(memory_get_usage(true) - $m) . PHP_EOL;

$s = microtime(true);

foreach ($container as $key => $value) {

$void = $value;

}

echo ' - Read - time : ' . str_pad(microtime(true) - $s, 20, '0') . PHP_EOL;

unset($container);

}

结果有点预期 – SplFixedArray()写入速度更快,读取速度稍慢.当我在前一个的unset()之后放入另一个相同的SplFixedArray()测试时,事情开始变得奇怪,请参阅输出:

> Testing size: 64,000

Array()

- Write - time : 0.009041070938110400 - memory: 7.50 MB (7864320 bytes)

- Read - time : 0.004010915756225600

SplFixedArray()

- Write - time : 0.004639148712158200 - memory: 1.75 MB (1835008 bytes)

- Read - time : 0.005971908569335900

SplFixedArray()

- Write - time : 0.005653858184814500 - memory: 1.50 MB (1572864 bytes)

- Read - time : 0.006288051605224600

为什么第二次测试使用的内存少于第一次?嘿,我尝试添加下一个测试,并:

> Testing size: 64,000

Array()

- Write - time : 0.008963823318481400 - memory: 7.50 MB (7864320 bytes)

- Read - time : 0.004142045974731400

SplFixedArray()

- Write - time : 0.005026102066040000 - memory: 1.75 MB (1835008 bytes)

- Read - time : 0.005756139755249000

SplFixedArray()

- Write - time : 0.004483938217163100 - memory: 1.50 MB (1572864 bytes)

- Read - time : 0.005591869354248000

SplFixedArray()

- Write - time : 0.004633903503418000 - memory: 1.25 MB (1310720 bytes)

- Read - time : 0.005697011947631800

所以我当然会尝试添加越来越多的内容,然后在512 kB之后再减少几次.我的问题在这里是显而易见的:如何可能以及为什么当我取消设置上一个对象并创建新对象时,使用的内存较低?它也适用于普通的数组().

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值