引用php函数中的变量有助于节省内存吗?

dki*_*zer 20 php

例如,当比较如何管理内存时,以下两个函数是否相同:

$hello = 'hello';

my_echo($hello);

//Better or worse than
my_echo_ref($hello);

//case 1, no referencing:
function my_echo($word) {
 echo $word;
} 

//case 2, referencing:
function my_echo_ref(&$word) {
  echo $word;
}
Run Code Online (Sandbox Code Playgroud)

Fel*_*ing 27

我不知道这个来源有多可靠,但这是一篇非常有趣的文章(自2008年起),它解释了如何处理变量:

关于PHP变量的真相

它说

我想写这篇文章来澄清PHP中常见的误解 - 在传递大变量时使用引用是一种节省内存的好方法.

(...)虽然上面对引用的解释足以得到一般性的理解,但理解PHP如何在内部处理变量赋值通常很有用.这是我们介绍zval概念的地方.

zvals是一个内部PHP结构,用于存储变量.每个zval包含各种信息,我们将在这里重点介绍如下:

  • 存储在zval中的实际数据 - 在我们的示例中,这将是'hello!' 或者"再见!"
  • is_ref布尔标志
  • 一个ref_count计数器

(......)

(...)当您按值分配变量时(例如在示例1中),它不会创建新的zval,它只是将两个变量指向相同的zval,并将zval的ref_count增加1."等等!"我听到你哭了,"这不是通过引用传递的吗?"好吧,虽然它听起来一样,所有PHP正在做的是推迟任何复制,直到它真的必须 - 并且它知道这是因为is_ref仍然是假的.(......)

和结论:

您可以看到,除非开发人员完全一致,否则通过引用传递变量很容易导致内存使用量增加.


除此之外,我运行了几次你的代码get_memory_usage()并且内存消耗没有差别(但这并不一定意味着什么,当一个人实际上对变量做某事时,内存消耗可能不同).


mag*_*nes 5

记录(php 7.0-win32)

我正在测试它(我将变量传递给函数,然后更改了函数内部的值),然后发现:

a)unset($ var)和$ var = null行为相同。

b)通过引用而不是值传递数组,在某些时候使内存使用量加倍。为什么?,我不知道。我是用memory_get_peak_usage()找到的。但是,memory_get_usage()不会改变,因此我猜想它会复制信息(可能在时间变量中),然后将其丢弃。

例如:(内存只是一个近似值)

  $var= (10mb of data as an array)  = memory peak 10mb.
  function functionval($var) {
       $var= (100mb of data) = memory peak 110mb.
  }
  function functionref(&$var) {
       $var= (100mb of data) = memory peak 210mb. !!! 
  }
Run Code Online (Sandbox Code Playgroud)

  $var= (100mb of data as an array)  = memory peak 100mb.
  function functionval($var) {
       $var= (10mb of data) = memory peak 110mb.
  }
  function functionref(&$var) {
       $var= (10mb of data) = memory peak 120mb. !!! 
  }
Run Code Online (Sandbox Code Playgroud)

  $var= (100mb of data as an array)  = memory peak 100mb.
  function functionval($var) {
       $var= (100mb of data) = memory peak 200mb.
  }
  function functionref(&$var) {
       $var= (100mb of data) = memory peak 300mb. !!! <-- why???
  }
Run Code Online (Sandbox Code Playgroud)

  $var= (100mb of data as an array)  = memory peak 100mb.
  function functionval($var) {
       not changing the data. = memory peak 100mb.
  }
  function functionref(&$var) {
       not changing the data. = memory peak 100mb.
  }
Run Code Online (Sandbox Code Playgroud)

c)将参数作为值或参考传递几乎不会改变执行时间。

d)传递对象作为参考,在某些时候使内存使用量增加一倍。