gpt4 book ai didi

PHP 通过引用传递增加了内存使用

转载 作者:行者123 更新时间:2023-12-05 07:55:57 27 4
gpt4 key购买 nike

当调用函数并传入一个大字符串时,我通常通过引用传递。目的是防止 PHP 按值传递字符串的副本,从而减少内存使用。然而,我注意到在某些情况下情况恰恰相反。

在下面的示例中,在调用 is_string() 时将字符串按引用传递给函数时,峰值内存使用量翻了一番。

代码:

$buf = '';
report_memory(__LINE__);

$buf = file_get_contents('./20MB.pdf');
report_memory(__LINE__);

example($buf);
report_memory(__LINE__);

function example(& $str) {
report_memory(__LINE__);
is_string($str);
report_memory(__LINE__);
}

function report_memory($line=0) {
echo 'Line: ' . str_pad($line,3) . ' ';
echo 'Mem: ' . str_pad(intval(memory_get_usage()/1024 ) . 'K',8) . ' ';
echo 'Peak: ' . str_pad(intval(memory_get_peak_usage()/1024) . 'K',8) . ' ';
echo "\n";
}

输出:

Line: 2   Mem: 625K     Peak: 631K
Line: 5 Mem: 21058K Peak: 21076K
Line: 11 Mem: 21058K Peak: 21076K
Line: 13 Mem: 21058K Peak: 41494K
Line: 8 Mem: 21058K Peak: 41494K

更改函数 example() 以删除引用:

function example($str) {
report_memory(__LINE__);
is_string($str);
report_memory(__LINE__);
}

输出:

Line: 2   Mem: 625K     Peak: 631K
Line: 5 Mem: 21058K Peak: 21076K
Line: 11 Mem: 21058K Peak: 21076K
Line: 13 Mem: 21058K Peak: 21076K
Line: 8 Mem: 21058K Peak: 21076K

这是我所期望的。那么当变量是引用时,为什么内存会随着 is_string() 加倍?

环境是 CentOS 6.6,运行 PHP 5.3.3。

最佳答案

Zend 引擎使用延迟复制机制。在修改变量之前,它不会创建变量的副本。 PHP 创建了一组用于维护引用的结构,这就是为什么通过引用传递变量实际上“更慢”的原因。

关于PHP 通过引用传递增加了内存使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29082588/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com