php:output [] w / join vs $ output。=

时间:2008-09-21 15:56:50

标签: php string-concatenation

我正在修改一些代码,其中原作者通过使用数组构建了一个网页:

 $output[]=$stuff_from_database;
 $output[]='more stuff';
 // etc
 echo join('',$output);

任何人都可以想到为什么这样做会更好(反之亦然):

 $output =$stuff_from_database;
 $output .='more stuff';
 // etc
 echo $output;

10 个答案:

答案 0 :(得分:13)

它可能是由一个来自语言的人编写的,其中字符串是不可变的,因此连接是昂贵的。 PHP不是其中之一,如以下测试所示。所以第二种方法是性能明智,更好。我能想到使用第一种方法的另一个原因是能够用另一种方法替换数组的某些部分,但这意味着要跟踪未指定的索引。

~$ cat join.php
<?php

for ($i=0;$i<50000;$i++) {
$output[] = "HI $i\n";
}

echo join('',$output);
?>


~$ time for i in `seq 100`; do php join.php >> outjoin ; done

real    0m19.145s
user    0m12.045s
sys     0m3.216s

~$ cat dot.php
<?php

for ($i=0;$i<50000;$i++) {
$output.= "HI $i\n";
}

echo $output;
?>


~$ time for i in `seq 100`; do php dot.php >> outdot ; done

real    0m15.530s
user    0m8.985s
sys     0m2.260s

答案 1 :(得分:2)

这有点偏离主题,但

$output =$stuff_from_database;
$output .='more stuff';
// etc
echo $output;

远远慢于:

echo = $stuff_from_database;
echo 'more stuff';

事实上,在PHP中构建字符串的最快方法是:

ob_start();
echo = $stuff_from_database;
echo 'more stuff';
$output = ob_get_contents();
ob_end_clean();

由于输出缓冲区的工作方式等,它是构建字符串的最快方法。显然,如果你真的需要优化sting构建,你只会这样做,因为它很难看,并且不会导致轻松阅读代码。每个人都知道“过早优化是所有邪恶的根源”。

答案 2 :(得分:2)

同样,有点偏离主题(不是很远),但如果你的目标是在输出的数组项之间放置一些内容,那么如果只有几行连接,则加入(',',$ output) )会轻松快速地做到这一点。这样写起来会更容易,并且避免必须检查列表的末尾(你不想要尾随',')。

对于程序员来说,因为它比cpu周期的价格高出1000倍,所以如果它不会每秒运行10,0000次以上,我通常会把它扔进一个联接

这样的后编码微优化很少值得花费时间来节省cpu时间。

答案 3 :(得分:1)

&lt; ! - 编辑上一条评论 - &gt;

我的代码中出现错误,所以我做了一个无操作,忘了检查。

对于之前的测试,看起来像Contary,并阅读有关该主题的以前的博客, 以下结论实际上(测试过)不真实至少对于我可以置换的上述代码的所有变体。

  1. UNTRUE :字符串插值比字符串连接慢。 (!)
  2. UNTRUE :SprintF最快。
  3. 在实际测试中,Sprintf是最慢的,插值是最快的

    PHP 5.2.6-pl7-gentoo (cli) (built: Sep 21 2008 13:43:03) 
    Copyright (c) 1997-2008 The PHP Group
    Zend Engine v2.2.0, Copyright (c) 1998-2008 Zend Technologies
        with Xdebug v2.0.3, Copyright (c) 2002-2007, by Derick Rethans
    

    这可能是我的设置的条件,但它仍然是奇怪的。 :/

答案 4 :(得分:1)

我认为最快的方法是使用回声。它不是那么漂亮,可能还不够快,值得花费可读性。

echo $stuff_from_database
   , 'more stuff'
   , 'yet more'
   // etc
   , 'last stuff';

答案 5 :(得分:0)

底部将重复重新分配$ output字符串,而我相信top会将每个部分存储在一个数组中,然后在最后将它们全部连接起来。原始示例最终可能会更快。如果这对性能不敏感,那么我可能会附加,而不是加入。

答案 6 :(得分:0)

如果与implode()join()结合使用,PHP可以更好地优化它。它遍历列表中的所有字符串,计算长度并分配所需的空间并填充空间。与“。=”相比,它必须经常free()malloc()字符串的空间。

答案 7 :(得分:0)

这部分代码对性能不敏感;它用于在低流量网站上格式化和显示用户的购物车信息。此外,数组(或字符串)每次都是从头开始构建的,不需要寻址或搜索特定元素。这听起来像数组更有效,但我想这两种方式无关紧要。感谢所有信息!

答案 8 :(得分:0)

如果您要生成一个列表(例如购物车),您应该有一些代码可以从数据库中提取的每个条目生成HTML。

for ($prod in $cart)
{
  $prod->printHTML();
}

或类似的东西。这样,代码变得更加清晰。当然,这假设您拥有对象的漂亮代码,而不是像我公司那样(并且正在取代)整个混乱的代码。

答案 9 :(得分:0)

已经说过,但我认为一个明确的答案会有所帮助。

最初的程序员就是这样写的,因为他认为它更快。事实上,在PHP 4下,它确实更快,特别是对于大字符串。