4

关于从 PHP 输出 html 的不同方法的问题;这些之间的性能差异是什么:

方法 1 - 变量串联

$html = '';
$html .= '<ul>';
for ($k = 1; $k < = 1000; $k++){
    $html .= '<li> This is list item #'.$k.'</li>';
}
$html .= '</ul>';
echo $html;

方法 2 - 输出缓冲

ob_start();
echo '<ul>';
for ($k = 1; $k < = 1000; $k++){
    echo '<li> This is list item #',$k,'</li>';
}
echo '</ul>';

我怀疑您会因不断修改和扩大变量而受到一些性能影响;那是对的吗?

干杯!

谢谢 GaryF,但我不想要关于架构的答案——这个问题是关于性能的。关于哪个更快,似乎有一些不同的意见/测试,这就是为什么还没有一个公认的答案。

4

8 回答 8

5

撇开字符串连接本身的想法不谈,你真的在​​问(我认为)你应该如何构建网页,我觉得任何形式的显式连接都可能是错误的做法。

尝试使用Model-View-Control 模式来构建您的数据,并将其传递给一个简单的模板库(如Smarty),并让它担心如何构建您的视图。

更好的分离,更少的担忧。

于 2008-10-06T22:41:55.707 回答
2

我通常使用方法 #1,因此我可以将该 HTML 放在包含静态 HTML 的模板文件中的任何位置。我尝试在我的 PHP 中保留尽可能多的 HMTL。它使 PHP 更简洁、更短,因为模板通常是一个单独的文件。

关于速度/性能,我认为差异将非常小。使用输出缓冲,它也一直在扩大一个变量,尽管该变量不可访问,但它必须存储在某个地方。

我经常想知道打开和关闭<?php是否比将其全部放入<?php然后一次全部回显要慢。

我认为最终我们在极其复杂的脚本中谈论毫秒。

哦,是的,方法#1 在任何地方都更加灵活echo $html;

于 2008-10-06T22:17:29.373 回答
2

它有点旧,但Sara Golemon 的这篇文章可能会有所帮助。AFAIK 输出缓冲功能非常快速和高效echo,所以这就是我要使用的。

于 2009-01-07T04:30:07.227 回答
1

确实,不断修改变量并重新打印它会产生轻微的开销。但是,这样做意味着脚本可能会在某些时候完成运行(由于中断或类似原因),并且连续的 echo 语句将部分打印页面而不是什么都打印。

于 2008-10-06T22:18:23.787 回答
1

我打算输入一个关于 PHP 字符串如何可变的长回复(与 C 或 C# 中的不可变字符串相反),但我想我只会链接到我遇到的旧帖子。关于使用字符串生成器的 Java 和 C# 解决方案,我基本上处理了您的问题。

旁注:stringbuilder 解决方案将类似于(未经测试):

$html = array();
$html[] = '<ul>';
for ($k = 1; $k < = 1000; $k++){
    $html[] = '<li> This is list item #';
    $html[] = $k;
    $html[] = '</li>';
}
$html[] = '</ul>';
echo implode('',$html);
于 2008-10-06T22:27:30.557 回答
1

只是几个想法:

  • 输出缓冲可以让你的页面看起来很慢,因为在整个脚本运行之前用户什么都看不到(尽管你有 #1 设置的方式同样适用)。

  • php 中的字符串是可变的,因此连接并不像其他一些语言那样糟糕。话虽如此,输出缓冲可能会快一点,因为默认情况下为输入分配的空间相当大(根据this 40K )

最后我想说这更多的是风格问题。如果您喜欢输出缓冲给您带来的好处,那么这可能是您要走的路。

于 2008-10-06T22:29:13.750 回答
1

您的问题的答案也可以在这里找到:php: output[] w/ join vs $output .=

字符串连接是构建字符串的最快方法。

我还没有测试过“回声”与字符串构建,但只要你不使用缓冲输出,回声应该是最快的,因为顺序写入自刷新缓冲区。(只有减速在冲洗,即使你提前进行字符串连接,你也不会真正避免)

于 2008-10-06T22:38:18.850 回答
0

我没有看到提到的是,通常,PHP 人员必须与需要对 HTML 进行分类或以其他方式添加样式的设计人员合作,因此解决方案必须牢记这一点。

于 2008-10-07T01:31:31.450 回答