Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/277.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 减少阵列和SplFixedArray的内存使用_Php_Arrays_Memory Management - Fatal编程技术网

Php 减少阵列和SplFixedArray的内存使用

Php 减少阵列和SplFixedArray的内存使用,php,arrays,memory-management,Php,Arrays,Memory Management,我在array()和SplFixedArray()之间做了一些基准测试,我遇到了奇怪的行为。首先,看看我的简单测试(它实际上只是从互联网上编辑的版本,对不起,我现在找不到原始源代码): 为什么第二次测试使用的内存比第一次少?嘿,我尝试添加下一个测试: > Testing size: 64,000 Array() - Write - time : 0.008963823318481400 - memory: 7.50 MB (7864320 by

我在
array()
SplFixedArray()
之间做了一些基准测试,我遇到了奇怪的行为。首先,看看我的简单测试(它实际上只是从互联网上编辑的版本,对不起,我现在找不到原始源代码):

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

> 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

因此,我当然会尝试添加越来越多的内容,在512kb上停止了几次之后。我这里的问题很明显:这是怎么可能的,为什么当我取消设置以前的对象并创建新对象时,使用的内存较低?并且它也适用于普通的
数组()

如果我们想了解这一点,我们需要进入引擎。更好:在里面

内存管理器分配的内存被分割为多个内存块

释放SPLFixedArray后。始终保留一个256 KB的块(一些变量),然后进行累积。(作为操作系统分配内存的下一个工作区,将与此内存块相邻)

然后,在可能的情况下,下次使用该内存段,而不是从操作系统分配新内存。(如有必要,可添加一些内存)

但由于至少有一个256KB的块总是被释放,我们总是会注意到256KB的差异



当您想要测量内存使用情况时,我真的会使用
memory\u get\u usage(false)
,因为它指示您有多少内存(≠ (d)需要。(唯一与
内存限制
ini设置相对应的是)

您是一个接一个地进行了每个测试,还是在测试之间重置了服务器?你确定没有任何缓存工作吗?我试着在两台完全不同的服务器上运行,但至少有一台没有缓存。嗯,你可以自己在自己的环境中尝试一下,看看它是否也适用于你……嗨,你有没有可以下载的文件?如果这几天我有时间,我可以试试。源代码在我的帖子里。如果您想复制它,只需在前一个数组的
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