例如,当比较如何管理内存时,以下两个函数是否相同:
$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如何在内部处理变量赋值通常很有用.这是我们介绍zval概念的地方.
zvals是一个内部PHP结构,用于存储变量.每个zval包含各种信息,我们将在这里重点介绍如下:
- 存储在zval中的实际数据 - 在我们的示例中,这将是'hello!' 或者"再见!"
- is_ref布尔标志
- 一个ref_count计数器
(......)
和
(...)当您按值分配变量时(例如在示例1中),它不会创建新的zval,它只是将两个变量指向相同的zval,并将zval的ref_count增加1."等等!"我听到你哭了,"这不是通过引用传递的吗?"好吧,虽然它听起来一样,所有PHP正在做的是推迟任何复制,直到它真的必须 - 并且它知道这是因为is_ref仍然是假的.(......)
和结论:
您可以看到,除非开发人员完全一致,否则通过引用传递变量很容易导致内存使用量增加.
除此之外,我运行了几次你的代码get_memory_usage()
并且内存消耗没有差别(但这并不一定意味着什么,当一个人实际上对变量做某事时,内存消耗可能不同).
记录(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)传递对象作为参考,在某些时候使内存使用量增加一倍。
归档时间: |
|
查看次数: |
4003 次 |
最近记录: |