【问题标题】:PHP performance: appending vs prepending stringsPHP 性能:附加与前置字符串
【发布时间】:2011-05-15 17:14:13
【问题描述】:

哪个性能更好:($longstring . $longstring) . $longstring$longstring . ($longstring . $longstring)? PHP 的连接运算符是左关联还是右关联?它的关联性是最优的,还是应该用括号覆盖它的关联性?

【问题讨论】:

  • 近距离投票过于本地化,因为这会产生影响的场景是如此狭窄和特殊,通常不适用于互联网的全球观众,可能包括 OP。如果这对您的项目很重要,请不要使用 PHP。
  • @Gordon 我问这个问题不是因为我想进行微优化,而是因为我想知道 PHP 如何处理字符串连接。我不是想“有所作为”,而是想变得开明。
  • 那么你可能想从你的问题中删除询问性能的部分,因为在性能方面它在实践中可以忽略不计到 99+%。

标签: php performance string


【解决方案1】:

真的,真的没关系。差异最多只有几毫秒。

按照最适合您的编码风格和未来可维护性的方式编写它。

【讨论】:

  • 是否重要取决于$longstring的大小我认为:)
  • @ppalka 我认为几乎没有,即使它是兆字节大
【解决方案2】:

正如 Pekka 所说,这真的无关紧要,我认为没有任何严肃的基准。如果您真的想知道,您应该尝试并衡量。

至于关联性,我认为最常见的 concat 函数是从左到右的。

http://www.php.net/manual/en/language.operators.string.php

【讨论】:

    【解决方案3】:

    两者应该没有区别。两者都首先为 ($longstring . $longstring) 分配一个额外的 2n 字符串,然后为整个事物分配一个额外的 3n 字符串。 Parens 让我感到困惑,因为它们应该传达一些含义,但在这种情况下,它们只是因为你认为它更快而存在。如果任一组没有什么特别之处,$s1 . $s2 . $s3 更可取。

    出于性能原因而对如此微小的细节进行微观管理是浪费时间。正如 Pekka 所说,它在速度上的差异非常小。您可以花费相同的时间来寻找能够真正显着提高性能的东西。

    编辑:如果字符串真的很长而且真的很多,并且正在减慢真正的请求,您应该考虑在不创建单个字符串的情况下传递它们。保留它们的数组,然后将它们输出或存储而不连接。

    【讨论】:

      【解决方案4】:

      $x . $y . $z($x . $y) . $z 相同

      但是,这两种方法都无法获得性能。就像:

      // ($x . $y) . $ z
      $tmp = $x . $y;
      return $tmp . $z;
      

      // $x . ($y . $ z)
      $tmp = $y . $z;
      return $x . $tmp;
      

      在这两种情况下,都发生了相同数量的串联。如果一种方法更快(但两者都不是),那么它将取决于$x$y$z 的长度。 (即,将短字符串附加到长字符串或将长字符串附加到短字符串是否更快,这确实是您要问的问题。如果不进行测试,我会说差异微不足道。)

      现在,它们是不同的:$x .= $y$x = $y . $x。第一个是单个 ASSIGN_CONCAT 追加操作,它可能比预置(CONCATASSIGN)快得多。请注意,$x = $x . $y 虽然在功能上等同于$x .= $y,但也是两个操作。因此,这种追加方式与前置具有相同的性能差异(如果有的话)。

      【讨论】:

      • 我对我的回答做了一个小小的说明。请注意,您的问题实际上归结为将大字符串附加到小字符串是否更快,反之亦然,因为这两种方法之间的实际操作是相同的。如果您要进行基准测试,您可能需要考虑这一点。不过,我普遍同意这一共识,即除了满足自己的好奇心之外,这一切都不重要。 ;)
      猜你喜欢
      • 1970-01-01
      • 2017-04-19
      • 2015-04-27
      • 1970-01-01
      • 1970-01-01
      • 2020-12-16
      • 1970-01-01
      • 2016-07-14
      • 1970-01-01
      相关资源
      最近更新 更多