在使用内联string与php5串联速度差异?
(假设php5)考虑
<?php $foo = 'some words'; //case 1 print "these are $foo"; //case 2 print "these are {$foo}"; //case 3 print 'these are ' . $foo; ?>
1和2之间有很大的区别吗?
如果不是,那么1/2和3之间呢?
那么,就像所有的“现实生活中有什么更快”的问题一样,你不能打败真正的人生testing。
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%的速度,这并不是很大的震动。 插值parsing器会查找,找不到任何东西,然后用一个简单的内部stringconcat来完成。 即使concat是昂贵的,内插器仍然必须这样做,毕竟parsing出variables和修剪/复制原始string的工作。
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
当你只是声明一个string而不需要parsing这个string时,为什么要混淆PHPdebugging器来parsing。 我希望你明白我的意思。
性能差异至less从2012年1月开始无关紧要 ,
Single quotes: 0.061846971511841 seconds Double quotes: 0.061599016189575 seconds
早期版本的PHP可能有所不同 – 我个人更喜欢单引号加双引号,所以这是一个很方便的区别。 这篇文章的结论提出了一个很好的观点:
永远不要相信你没有伪造的统计数据。
(尽pipe文章引用了这句话,原来的讽刺也许是错误地归因于乔治·戈培尔宣传部发明的丘吉尔(Winston Churchill)把丘吉尔描绘成骗子:
Ich traue keiner Statistik,die ich nicht selbstgefälschthabe。
这可以松散地转化为“我不相信我没有伪造自己的统计数据”。)
@亚当的testing使用
"these are " . $foo
请注意以下事项甚至更快:
'these are ' . $foo;
这是由于这样一个事实,双引号的“string”得到评估,其中一个单引号的“string”就像是…
不要太过于试图优化PHP中的string操作。 如果您的数据库查询写得不好,或者您没有使用任何types的cachingscheme,则连接与插值无关(在现实世界的性能中)。 以这种方式编写string操作,稍后debugging代码将变得简单,性能差异可以忽略不计。
@uberfuzzy假设这只是一个关于语言细节的问题,我认为没关系。 我只是试图增加对话,比较实际应用中的单引号,双引号和heredoc之间的性能,而不是真正的性能汇(例如数据库查询不佳)。
执行时间的任何差异是完全可以忽略的。
请参见
- NikiC的博客:反驳单引号性能神话的技术解释如何插值和连接在PHP中工作,以及为什么关心他们的速度是毫无意义的。
不要浪费时间在这样的微观优化上。 使用分析器来衡量应用程序在真实世界中的性能,然后优化真正需要的地方。 优化一个简单的数据库查询可能会比在您的代码中应用微观优化更大的性能改进。
我似乎记得,论坛软件的开发者Vanilla用单引号replace了他的代码中的所有双引号,并注意到合理的性能提升。
尽pipe目前我似乎无法追踪到讨论的链接。
当连接variables…和你正在做的结果有什么区别…如果你正在做的是转储它输出,是或不是输出缓冲。
另外,服务器的内存情况如何? 通常在较高级平台上的内存pipe理比在较低平台上的内存pipe理更差…
$a = 'parse' . $this;
在用户代码平台级别pipe理内存
$a = "parse $this";
在php系统代码平台级别pipe理内存…
所以这些与CPU相关的基准testing并没有讲完整的故事。
运行基准testing1000次,在试图同时运行同样的模拟1000次的服务器上运行基准testing1000次…根据应用程序的范围,您可能会得到截然不同的结果。
双引号会慢很多。 我从几个地方读到,最好这样做
'parse me '.$i.' times'
比
"parse me $i times"
虽然我会说第二个给你更可读的代码。
实际上根本没有区别! 请参阅计时: http : //micro-optimization.com/single-vs-double-quotes
只需要添加其他的东西,如果你在双引号string语法中使用一个variables:
$foo = "hello {$bar}";
比…更快
$foo = "hello $bar";
而且这两个都比
$foo = 'hello' . $bar;
应该注意的是,当使用亚当·赖特(Adam Wright)的例子的修改版本以及3个variables时,结果是相反的,前两个函数实际上更快一致。 这是在CLI上的PHP 7.1:
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'; $bar = 'other words'; $bas = 3; for ($i = 0; $i < 10000; $i++) $t = "these are $foo, $bar and $bas"; } function Method2() { $foo = 'some words'; $bar = 'other words'; $bas = 3; for ($i = 0; $i < 10000; $i++) $t = "these are {$foo}, {$bar} and {$bas}"; } function Method3() { $foo = 'some words'; $bar = 'other words'; $bas = 3; for ($i = 0; $i < 10000; $i++) $t = "these are " . $foo . ", " . $bar . " and " .$bas; } print timeFunc('Method1', 10) . "\n"; print timeFunc('Method2', 10) . "\n"; print timeFunc('Method3', 10) . "\n";
我也尝试了'3',而不是只有整数3,但我得到了同样的结果。
用$ bas = 3:
0.0016254 0.0015719 0.0019806
用$ bas ='3':
0.0016495 0.0015608 0.0022755
应该指出的是,这些结果差异很大(我得到约300%的变化),但平均值似乎相对稳定,几乎(10个案例中的9个)总是显示出2个第一种方法更快的执行,方法2总是比方法1略快。
总而言之,对于单个操作(不pipe是内插还是串联),对于组合操作,情况并非总是如此。