使用&$来处理大字符串以节省内存是否更好?

4
我想知道,在一台繁忙的服务器上,为了节省一些宝贵的内存分配,如果我的程序中有大约1-5mb的字符串在编译最终输出时被传递,是不是更好地通过引用显式地传递它们?这样做能否节省内存?
基本上问题就是:哪个更好,A还是B,就内存而言。这值得付出努力吗?
A:
function something($whoa) {
  $whoa .= 'bar';
  return $whoa;
}
$baz = 'foo';
$baz = something($baz);
echo $baz;

B:

function something(&$whoa) {
  $whoa .= 'bar';
}
$baz = 'foo';
something($baz);
echo $baz;

你可以使用memory_get_usage来运行自己的测试。 - rdiz
两种方法都会创建一个新的字符串。很难想象在这种情况下会有可观的节省。 - user2864740
我知道我可以这样做,但我想听听那些更熟悉PHP内部工作的人的意见,看看哪种方法更好。我自己也能进行测试,但这也是为了谷歌,因为没有结果出现,我经常在思考这个问题。如果我得不到一个好的答案,我会自己去探究。我只是很好奇。 - Tschallacka
1个回答

7

是的。

PHP 使用 写时复制,因此如果您只是使用字符串(例如显示它们),它不会复制它们。但是,一旦您开始像在函数中那样操作它们,就会进行复制,使用的内存量将增加。

正如评论中提到的那样,您可以使用 memory_get_usage() 轻松测量它。

示例:

将会进行复制(值被操纵,因此将写入新值):

function something($whoa) {
  $whoa .= 'bar';
  return $whoa;
}

不会复制任何内容:

function somethingElse($whoa) {
  echo $whoa;
  return true;
}

使用引用时,写时复制是否也会发生? - Tschallacka
1
@MichaelDibbets 不,那样做会改变原始变量。 - jeroen
1
你能否扩展你的回答,包括一些代码示例,其中涉及到代码复制和不复制的情况吗?这样未来的读者就可以轻松地识别自己的代码与所述用例,以防他们不理解写时复制。 - Tschallacka

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接