PHP:输出[] W /加入VS $输出=(php: output[] w/ join vs $ou

2019-09-18 07:24发布

我修改一些代码,其中原作者通过使用阵列正是如此建立了一个网页:

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

谁能想到一个原因,这将是可取的(反之亦然)到:

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

Answer 1:

它可能是由人谁来自哪里string是不可改变的,因此串联昂贵语言编写。 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


Answer 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();

由于该输出缓冲器工作,这样的方式,它是建立一个字符串的最快方法。 很显然,你只会做这个,如果你真的需要优化蜇建筑,因为它是丑陋的,不会导致代码的方便阅读。 每个人都人知道“过早的优化是所有罪恶的根源。”



Answer 3:

同样,一点点题外话(不是很远),但如果你是旨在把数组项之间的东西被输出,则如果有只有几行来连接,加入(“”,$输出)会做它方便,快捷地就够了。 这将是更容易编写,并避免了检查列表的末尾(如果你不希望尾随“”)。

对于程序员的时间,因为它的时间比CPU周期更昂贵的1000年代的顺序,我通常只是把它转换为连接,如果不打算要它运行每秒10,0000+倍。

编码后的微优化这样是很少值得在采取VS节省CPU时间的时间方面。



Answer 4:

< ! -绝密以前批注- >

这样看来,我在我的代码有一个错误,所以我在做一个空操作,忘了检查。

这样看来Contary以前的测试和阅读的话题之前的博客文章,得出以下结论实际上是(测试) 不真实 ,至少上面的代码,我可以置换的所有变体。

  1. 不真实 :字符串插值比字符串连接速度较慢。 (!)
  2. 不真实 :sprintf的是最快的。

在实际测试中,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

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



Answer 5:

我认为这样做的最快方法是与之相呼应。 这不是因为漂亮,很可能不够快,值得在可读性成本。

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


Answer 6:

底部将反复重新分配$输出字符串,而我相信顶部将只存储在一个阵列中的每个部分,然后加入他们全都在结尾处。 最初的例子可能最终被更快的结果。 如果这不是性能敏感的,那么我可能会追加,不加入。



Answer 7:

在这部分代码的性能并不敏感; 它是用来格式化并显示在低流量的网站,用户的购物车信息。 另外,所述阵列(或字符串)是每次都从头建立,并且没有必要处理或搜索特定元素。 这听起来像数组是较为有效的,但我想这不要紧,这个使用两种方式。 感谢所有的信息了!



Answer 8:

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

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

或类似的东西。 这样一来,代码变得更加简洁。 当然,这是假定你有漂亮的代码使用对象,而不是像我公司的整体鲁钝乱做(并更换)。



Answer 9:

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

原来的程序员写的,那是因为他认为这是更快。 事实上,PHP 4下,果然是快,特别是对于大型的字符串。



Answer 10:

如果有加入implode()join() ,PHP能够更好地优化这一点。 它通过列表中的所有字符串,计算长度和分配所需的空间和填充的空间。 在与比较“ =”它必须不断free()malloc()的字符串的空间。



文章来源: php: output[] w/ join vs $output .=