我正在网站上工作,我正在尝试尽可能快地制作它 - 特别是那些可以让我的网站更快一些的小东西。
所以,我的问题 - 我得到循环,运行5次,每次都回显一下,如果我将变量,循环将添加我想要回显到变量的文本,直到最后我会回应变量 - 它会更快吗?
循环1(循环内的回声)
for ($i = 0;$i < 5;$i++)
{
echo "test";
}
循环2(回显在[循环结束时])
$echostr = "";
for ($i = 0;$i < 5;$i++)
{
$echostr .= "test";
}
echo $echostr;
我知道循环2会增加一些文件大小,因此用户必须下载更多字节但是如果我得到了大量循环,那么使用第二个循环是否更好?
感谢。
答案 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