PHP效率问题

时间:2011-03-12 01:34:49

标签: php performance

我正在网站上工作,我正在尝试尽可能快地制作它 - 特别是那些可以让我的网站更快一些的小东西。

所以,我的问题 - 我得到循环,运行5次,每次都回显一下,如果我将变量,循环将添加我想要回显到变量的文本,直到最后我会回应变量 - 它会更快吗?

循环1(循环内的回声)

for ($i = 0;$i < 5;$i++)
{
    echo "test";
}

循环2(回显在[循环结束时])

$echostr = "";
for ($i = 0;$i < 5;$i++)
{
    $echostr .= "test";
}
echo $echostr;

我知道循环2会增加一些文件大小,因此用户必须下载更多字节但是如果我得到了大量循环,那么使用第二个循环是否更好?

感谢。

6 个答案:

答案 0 :(得分:3)

差异可以忽略不计。做任何更具可读性的东西(在这种情况下绝对是第一种情况)。第一种方法不是“天真”的方法,因此不存在重大的性能差异(实际上可能更快,我不确定)。第一种方法也将使用更少的内存。此外,在许多语言中(不确定PHP),附加到字符串是昂贵的,因此连接也是如此(因为你必须寻找字符串的末尾,重新分配内存等)。

此外,文件大小并不重要,因为PHP完全是服务器端的 - 用户永远不必下载你的脚本(事实上,如果他们这样做可能会很吓人)。这些类型的事情在Javascript中可能很重要,但在PHP中则不然。

长话短说 - 不要不断编写代码来尝试进行像这样的微优化。以最具可读性和惯用性的样式编写代码,测试性能是否良好,性能是否然后配置文件并重写性能不佳的部分。

我将以引用结束:

  “过早强调效率是一个很大的错误,很可能成为大多数编程复杂性和悲伤的源头。”    - 唐纳德克努特

答案 1 :(得分:3)

这是过早优化的经典案例。性能差异可以忽略不计。

我会说,一般来说你最好构建一个字符串并在最后回显它,但是因为它导致更清晰的代码(副作用很糟糕,mkay?)而不是因为性能。

如果你这样优化,从头开始,你就有可能混淆你的代码而无法获得可感知的好处。如果你真的希望你的脚本尽可能快,那么 profile it找出真正的瓶颈在哪里

有人提到使用字符串连接而不是立即回声将使用更多内存。除非字符串的大小超过输出缓冲区的大小,否则这不是真的。在任何情况下,要立即实际回显,您需要调用flush()(可能在ob_flush()之前),这会增加函数调用*的开销。 Web服务器仍然可以保留自己的缓冲区,无论如何都会阻止它。

如果你在循环的每次迭代中花费了大量的时间,那么早期回显和刷新可能是有意义的,所以用户不会一直等待下一次迭代,但是将是一个完全不同的问题。

此外,PHP文件的大小对用户没有影响 - 解析可能需要更长的时间,但是无论如何使用像APC这样的操作码缓存都会被否定。

总结,虽然它可能略微更快地回应每次迭代,但根据情况,它会使代码更难维护(想想Wordpress)而且它最多可能你的优化时间会更好地花在其他地方。

*如果你真的担心这种优化水平,那么就不会嗅到函数调用。刷新碎片也意味着额外的protocol overhead

答案 2 :(得分:2)

PHP文件的大小不会增加用户下载的大小。 PHP文件的输出对用户来说非常重要。

通常,您希望执行第一个选项:只要有数据就立即回显。假设您没有使用输出缓冲,这意味着用户可以在PHP脚本仍在执行时流式传输数据。

答案 3 :(得分:2)

用户不下载PHP文件,只下载其输出,因此第二个循环不会影响用户的下载大小。

最好不要担心小优化,而是专注于快速交付工作软件。但是,如果您想提高网站的性能,Yahoo!做了一些出色的研究:developer.yahoo.com/performance/rules.html

答案 4 :(得分:0)

理论上,你的第一个例子是最快的。因为您提供的代码非常简单,所以我怀疑第二个示例的性能提升会被注意到甚至是有用的。

在您的第一个示例中,PHP需要初始化和使用的唯一变量是$ i。

在第二个示例中,PHP必须首先创建一个空字符串变量。然后创建循环及其变量$ i。然后将文本附加到$ echostr,最后是echo $echostr

答案 5 :(得分:0)

您标识为“循环2”的代码不会是用户下载的文件大小。字符串连接比调用echo之类的函数更快,所以我选择循环2.对于循环的仅5次迭代我不认为它真的那么重要。

总的来说,还有很多其他领域需要关注,例如编译PHP而不是将其作为脚本语言运行。

http://phplens.com/lens/php-book/optimizing-debugging-php.php