PHP字符串连接 - "$a $b" vs $a . " " . $b - 性能

4

在以下两种方式中,是否存在速度差异:

$newstring = "$a and $b went out to see $c";

$newstring = $a . " and " . $b . " went out to see " . $c;

如果存在差异,为什么呢?

7个回答

16
根据PHP版本的不同,如果你这样写:$newstring = $a . ' and ' . $b . ' went out to see ' . $c;,第二个字符串的速度会有所不同。
在性能方面,PHP从版本到版本和构建到构建都非常不一致,因此你必须自己进行测试。需要说明的是,它还取决于$a$b$c的类型,如下所示。
当你使用"时,PHP会解析字符串,看看里面是否使用了任何变量/占位符,但如果你只使用',PHP会将其视为一个简单的字符串而没有进一步处理。因此,一般来说'应该更快。至少在理论上如此。在实践中,你必须进行测试。
结果(以秒为单位):
a, b, c are integers:
all inside "     : 1.2370789051056
split up using " : 1.2362520694733
split up using ' : 1.2344131469727

a, b, c are strings:
all inside "     : 0.67671513557434
split up using " : 0.7719099521637
split up using ' : 0.78600907325745  <--- this is always the slowest in the group. PHP, 'nough said

在使用Zend Server CE PHP 5.3时,可以使用以下代码:

<?php

echo 'a, b, c are integers:<br />';
$a = $b = $c = 123;

$t = xdebug_time_index();
for($i = 1000000; $i > 0; $i--)
    $newstring = "$a and $b went out to see $c";
$t = xdebug_time_index() - $t;
echo 'all inside " : ', $t, '<br />';

$t = xdebug_time_index();
for($i = 1000000; $i > 0; $i--)
    $newstring = $a . " and " . $b . " went out to see " . $c;
$t = xdebug_time_index() - $t;
echo 'split up using " : ', $t, '<br />';

$t = xdebug_time_index();
for($i = 1000000; $i > 0; $i--)
    $newstring = $a . ' and ' . $b . ' went out to see ' . $c;
$t = xdebug_time_index() - $t;
echo 'split up using \' : ', $t, '<br /><br />a, b, c are strings:<br />';

$a = $b = $c = '123';

$t = xdebug_time_index();
for($i = 1000000; $i > 0; $i--)
    $newstring = "$a and $b went out to see $c";
$t = xdebug_time_index() - $t;
echo 'all inside " : ', $t, '<br />';

$t = xdebug_time_index();
for($i = 1000000; $i > 0; $i--)
    $newstring = $a . " and " . $b . " went out to see " . $c;
$t = xdebug_time_index() - $t;
echo 'split up using " : ', $t, '<br />';

$t = xdebug_time_index();
for($i = 1000000; $i > 0; $i--)
    $newstring = $a . ' and ' . $b . ' went out to see ' . $c;
$t = xdebug_time_index() - $t;
echo 'split up using \' : ', $t, '<br />';

?>

6

由于它们是两种不同的语法,因此可能会有速度差异。您需要问的是差异是否重要。在这种情况下,我认为您无需担心。差异太微不足道。

我建议您按照您视觉上最合理的方式进行操作。"$a and $b went out to see $c" 在查看时可能会有点混淆。如果您想走这条路,我建议在变量周围加上花括号: "{$a} and {$b} went out to see {$c}"。


根据最小惊奇原则,两个意思完全相同的不同语法应该具有相同的属性。PHP可能没有这样做的事实只是PHP的一个糟糕属性。 - Ira Baxter
@Ira:情况甚至更糟...请看下面我的结果。在某些情况下最快的可能在另一种情况下最慢。 - Marius Burz

2
我进行了快速的基准测试,正如其他人所说,结果非常不一致。我没有注意到单引号与双引号相比没有任何性能提升。我猜这完全取决于个人偏好。
您可能希望将编码风格保持一致,并且如果您这样做,请选择双引号。替换功能比您想象的更实用。
我将基准测试代码放在了github上

2
如果你关心字符串拼接的速度,那么你正在使用错误的语言。对于这种情况,请在PHP脚本中调用C应用程序进行编译,如果这真的是瓶颈。

这是一个极其没有帮助的回答。这就像告诉波士顿的某个人,如果他们问天气是否会变暖,那么他们应该搬到迈阿密一样。 - MikeSchinkel
@MikeSchinkel:我认为更恰当的类比是:“我想去魁北克露营,想知道波士顿的天气怎么样?”答案显而易见:“魁北克不在波士顿,甚至不在美国,你正在寻找错误的答案。”说明哪种语法更快将支持OP集中于错误的信息,这对他成为更好的开发者没有任何帮助。同样的想法(表达方式更激进一些)可以在此处找到:http://weblogs.asp.net/alex_papadimoulis/archive/2005/05/25/408925.aspx - soulmerge
@soulmerge - 鉴于您对使用哪些工具的看法可能是唯一正确的观点,每天与如此多的智商较低的人打交道肯定让您感到孤独。 - MikeSchinkel
@MikeSchinkel:我不明白,你为什么这么激动?我冒犯你了吗? - soulmerge
只是为了澄清我的观点 - 我并不是真的“担心”,而是“好奇”。有时候我只是想知道事情是如何工作的,而且考虑到PHP的一般性能,如果结果相差一个或两个数量级,我也不会感到惊讶。是的,当然,在99.999%的情况下,这仍然没有任何区别,但考虑到这两种符号如此接近,使用“正确”的符号会很好。就像一个选项不是Java的StringBuffer的笨拙。 - J. Stoever
显示剩余3条评论

1

是的,有一些差异,但它们非常微不足道。

$newstring = "$a and $b went out to see $c";

并且

$newstring = $a . " and " . $b . " went out to see " . $c;

如果你使用了:

$newstring = $a . ' and ' . $b . ' went out to see ' . $c;

差别会略微大一些(但可能仍然可以忽略不计),原因是,如果我记得正确的话(我可能在这方面弄错了),PHP会扫描和解析双引号内的变量和特殊字符(\t、\n等),而在使用单引号时它不会解析变量或特殊字符,因此速度可能会略微提高。


根据我对字符串解析的了解,这是一个谬论,认为单引号会更快。但在我的经验中,恰恰相反。 - Peter Lindqvist

1

为什么不测试一下,比较一下差异呢?数字不会说谎,如果你发现其中一个表现更好,那么你应该问问为什么。


1
不知道为什么这个答案被踩了。当你使用PHP时,这是最好的建议。 - Marius Burz
因为那不是一个有用的答案。我已经知道我可以自己尝试。我在这里发布它是想看看其他人有什么要说的。 - J. Stoever

-2

没有任何区别,就是这样。 ;)


当然有这个问题,但并不重要。而且在不同的PHP版本之间也不一致。 - Marius Burz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接