(假设php5)考虑
1和2之间有很大差异吗?
如果没有,那么在1/2和3之间呢?
自2012年1月以来,性能差异无关紧要,可能更早:
Single quotes: 0.061846971511841 seconds Double quotes: 0.061599016189575 seconds
早期版本的PHP可能有所不同 - 我个人更喜欢单引号加双引号,所以这是一个方便的区别.该文的结论提出了一个很好的观点:
永远不要相信你自己没有伪造的统计数据.
(虽然文章引用了这句话,但最初的讽刺可能错误地归因于约瑟夫·戈培尔的宣传部发明的温斯顿·丘吉尔,将丘吉尔描绘成一个骗子:
Ich traue keiner Statistik,die ich nichtselbstgefälschthabe.
这松散地转化为"我不相信我没有假装自己的统计数据.")
好吧,就像所有"现实生活中可能更快"的问题一样,你无法击败现实生活中的考验.
function timeFunc($function, $runs) { $times = array(); for ($i = 0; $i < $runs; $i++) { $time = microtime(); call_user_func($function); $times[$i] = microtime() - $time; } return array_sum($times) / $runs; } function Method1() { $foo = 'some words'; for ($i = 0; $i < 10000; $i++) $t = "these are $foo"; } function Method2() { $foo = 'some words'; for ($i = 0; $i < 10000; $i++) $t = "these are {$foo}"; } function Method3() { $foo = 'some words'; for ($i = 0; $i < 10000; $i++) $t = "these are " . $foo; } print timeFunc('Method1', 10) . "\n"; print timeFunc('Method2', 10) . "\n"; print timeFunc('Method3', 10) . "\n";
给它几个运行页面,然后......
0.0035568
0.0035388
0.0025394
因此,正如预期的那样,插值几乎相同(噪声水平差异,可能是由于插值引擎需要处理的额外字符).直线连接约为速度的66%,这并不是很大的震撼.插值解析器将查找,无需执行任何操作,然后使用简单的内部字符串concat完成.即使concat很昂贵,插值器仍然必须这样做,在解析变量并修剪/复制原始字符串的所有工作之后.
Somnath的更新:
我将Method4()添加到上面的实时逻辑中.
function Method4() { $foo = 'some words'; for ($i = 0; $i < 10000; $i++) $t = 'these are ' . $foo; } print timeFunc('Method4', 10) . "\n"; Results were: 0.0014739 0.0015574 0.0011955 0.001169
当你只是声明一个字符串而不需要解析那个字符串时,为什么要混淆PHP调试器来解析.我希望你明白我的观点.
实时基准测试:
http://phpbench.com/
将变量与单引号和双引号连接时,实际上存在细微差别.
@ Adam的测试用过
"these are " . $foo
请注意以下内容更快:
'these are ' . $foo;
这是因为有一个双引号"字符串"得到评估,其中一个引用的"字符串"就是按原样...
不要试图在PHP中优化字符串操作.如果您的数据库查询写得不好或者您没有使用任何类型的缓存方案,则连接与插值是没有意义的(在实际性能中).编写字符串操作,以便以后调试代码很容易,性能差异可以忽略不计.
@uberfuzzy假设这只是一个关于语言细节的问题,我想它没关系.我只是试图在真实性能接收器(例如糟糕的数据库查询)中比较实际应用程序中单引号,双引号和heredoc之间的性能比较无意义的对话.
执行时间的任何差异都可以忽略不计.
请参阅
NikiC的博客:反驳单引号性能神话技术解释插值和连接如何在PHP中工作以及为什么关心它们的速度绝对没有意义.
不要在这样的微优化上浪费时间.使用分析器在实际场景中测量应用程序的性能,然后优化实际需要的位置.与在整个代码中应用微优化相比,优化单个草率数据库查询可能会带来更大的性能提升.