【问题标题】:Is there any benefit to unsetting an array before redeclaring it?在重新声明之前取消设置数组有什么好处吗?
【发布时间】:2015-02-02 14:46:37
【问题描述】:

在您看来,如果我有一个包含 100 000 个 8 字符字符串条目的数组,那么内存使用情况会更好吗?首先 unset($array) 然后将其重新声明为 $array = []; 或直接重新声明它(@ 987654323@)?

谢谢!

【问题讨论】:

  • 当您重新声明数组时,您也会取消设置数组。

标签: php initialization


【解决方案1】:

结果都是一样的。用任何新的东西覆盖“旧”数组会导致旧数组(最终)被垃圾收集并从系统中删除。是否分两个阶段进行:

unset($arr); // force delete old array
$arr = [];   // create new array

或者只是

$arr = []; // replace old array with new empty one

基本上归结为同样的事情:旧数组最终会被清理掉。

【讨论】:

  • 有人做了一个有趣的基准测试来实际看到它,我偶然发现它正在寻找memory_get_usage,我发现它确实让我大开眼界,并在更大的 PHP 垃圾收集范围,可以在这里找到tuxradar.com/practicalphp/18/1/11
  • 意料之中。垃圾收集是昂贵的。除非必须,否则 php 不会这样做 - 例如您请求的内存超出了“可用”池中的可用内存,或者您手动触发了 GC 系统。
  • 我做了一个快速的 Gist gist.github.com/AnrietteC/d9245343fe8e856da30e ,看起来虽然内存使用在取消设置或只是重新声明之间是并行的,但在不取消设置的情况下执行时间更快。似乎 unset() 真的只有在你不重新使用变量时才有好处。
【解决方案2】:

虽然Marc B's answer 绝对正确,但我想根据Daan 的评论亲眼看看。

使用memory_get_usage() 我在unset()重新声明 之间做了一个快速测试。两者都同样减少了内存。

unset()

$arr = array_fill(0, 1000000, 'abcdefgh'); // memory: 96613552
unset($arr);                               // memory:   224856

重新声明

$arr = array_fill(0, 1000000, 'abcdefgh'); // memory: 96613552
$arr = [];                                 // memory:   224856

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-23
    • 1970-01-01
    • 2019-03-27
    • 1970-01-01
    • 2014-04-11
    相关资源
    最近更新 更多