2

在开始之前,我不是在询问标准编码实践或“礼仪”。我的问题更多是出于对 PHP 内部结构的好奇。到目前为止,我的研究似乎发现人们对 PHP 的范围感到困惑。

在 PHP 中重用变量是否有任何好处/坏处,无论是内存还是速度?为了科学。

假设您在整个脚本中按顺序访问多个文件。

  • 场景 A:每个句柄都有一个变量,$file1、$file2、$file3 等。
  • 场景 B:您的句柄都重用了变量 $fp

这种理论场景是否需要分别占用资源密集型的脚本?B 会允许垃圾收集摆脱旧句柄而 A 不会吗?通过 Zend 进行的优化会使这成为一个非问题吗?

4

2 回答 2

4

这个问题没有一个简单的答案。优化和性能在很大程度上取决于您的特定代码库、它运行的平台、服务器上运行的其他内容等等。

首先,您的场景太模糊,无法提供足够的答案。但是,要触及一些先前的评论/担忧......

PHP 没有非常明确的垃圾收集规则。在 THEORY 场景中,由于垃圾收集,函数退出时 A 将释放内存。实际上,这种情况很少发生。有许多触发器会导致垃圾回收释放该内存,但在幕后,实际的低级 free() 和 mallocs() 并没有被淘汰。如果您仔细观察内存堆栈,您会发现在函数退出后,$file1、$file2、$file3 的内存空间将保留。有时直到整个应用程序退出。

您的应用程序构建还将确定哪个更快,在符号表中为 $file1、$file2、$file3 创建一个新条目或反复使用 $fp。在理论上,再次使用 $fp 通常意味着不需要重新分配内存空间,并且不需要重新创建新的符号表条目和相应的管理对象。然而,这并非总是如此。有时重新使用 $fp 实际上可能会更慢,因为需要先调用销毁,然后重新创建对象。在某些极端情况下,在迭代过程中创建一个新的 $file1、$file2、$file3 并让垃圾收集一次发生可能会更快。

所以,这一切的底线......

您需要在其原生环境中分析和测试您自己的应用程序,以了解事物在您的 Playground 中的行为方式。它很少是“总是这样做”或“从不这样做”的场景。

于 2012-06-20T00:35:57.873 回答
0

对我的答案没有信心,但我确实发现重用 var 可以节省更多内存,尤其是在将 var 重新用于查询结果时,因为这些 var 通常会在其中填充许多其他不需要的东西。

您可以使用

echo memory_get_usage()在代码执行的不同阶段查看差异并进行比较。

但随着代码的增长,它可能会变得令人困惑,并使人们更难阅读。

当脚本完成时,PHP 也会运行垃圾收集。所以你如何命名你的变量可能与它没有任何关系,而是影响它在执行期间使用多少内存。

于 2012-06-20T00:20:22.083 回答