变量追加vs多重回声 - 记忆明智

时间:2011-03-02 16:10:46

标签: php memory-management

我想知道,在这三种情况下,是否会影响内存使用情况和应用程序的速度:

为了举例,我将创建一个表

<table>
<?
foreach($tableDataFromMysql as $rows){
echo "<tr>";
echo "<td>";
echo $cell1;
echo "</td>";
echo "<td>";
echo $cell2;
echo "</td>";
echo "<td>";
echo $cell3;
echo "</td>";
echo "</tr>";
}
?>
</table>

或者

<table>
<?
foreach($tableDataFromMysql as $rows){
echo "<tr><td>".$cell1."</td>"."<td>".$cell2."</td>"."<td>".$cell3."</td></tr>";
}
?>
</table>

或者

<table>
<?
foreach($tableDataFromMysql as $rows){
$output="<tr>";
$output.= "<td>";
$output.= $cell1;
$output.= "</td>";
$output.= "<td>";
$output.= $cell2;
$output.="</td>";
$output.= "<td>";
$output.= $cell3;
$output.= "</td>";
$output.= "</tr>";
echo $output;
}
?>
</table>

要输出的行中有少量 n 个变量。对于这个例子,我刚刚使用了静态计数变量来输出。

所以,问题是:是否会对内存使用产生影响?

4 个答案:

答案 0 :(得分:2)

是的,有区别。由于变量赋值是存储,因此需要内存。打印数据会将其发送到通常预先分配的输出缓冲区。

每个例子,请考虑以下脚本:

echo 'foo';
echo memory_get_usage();  // 632600
echo 'foo';
echo memory_get_usage();  // 632600 (0 bytes have been allocated)

与此相比:

echo 'foo';
echo memory_get_usage();  // 633088
$a = 'foo';
echo memory_get_usage();  // 633352 (264 bytes have been allocated)

答案 1 :(得分:1)

您只需使用use memory_get_usage() / memory_get_peak_usage()进行试用即可。但是,我建议首先不要关注这种微优化。更好地使用模板引擎,这显然较慢,但通过划分逻辑和视图来收集更易维护的代码。

答案 2 :(得分:0)

在前两个例子中,我认为任何差异都是微不足道的。

对于第三个示例,仅当结果集非常大时才会看到任何明显的性能下降。但它将是最耗费内存的。

您可以轻松测试:

  1. 创建一个~10000行
  2. 的虚拟结果集
  3. 在循环开始之前立即存储microtime(true)
  4. 在循环结束后立即获取microtime(true)
  5. 打印出两个微缩胶片的差异,以秒为单位查看执行时间
  6. 在脚本末尾打印memory_get_peak_usage()
  7. 换掉三段不同的代码
  8. 多次运行每段代码以考虑环境中的变量
  9. 比较三种不同方法的结果

答案 3 :(得分:0)

这是另一个无处不在的问题 我打赌你没有一个内存使用问题(至少有一个与这个问题相关),但是没有理由问,以防万一。 这是提问的好方法。

内存使用并不是偏好一种方法而不是另一种方法的唯一原因 特别是,如果可以使用的内存量可以忽略不计 特别是如果有一些优化技术可以使用。

您发布的所有内容都只是编码风格,而不是内存使用情况。

为了便于阅读和良好的应用程序设计,上述两者都不应该使用,但大多数程序员都认为它应该是一个模板,基于从HTML和控制结构原则的替代语法中逃脱:

<table>
<? foreach($tableDataFromMysql as $row): ?>
 <tr>
  <td><?=$row['cell1']?></td>
  <td><?=$row['cell2']?></td>
  <td><?=$row['cell3']?></td>
 </tr>
<? endforeach ?>
</table>

注意HTML格式和突出显示 - 真正关心的事情。