php5中使用内联字符串与串联的速度差异?
(假设php5)考虑php5中使用内联字符串与串联的速度差异?,php,optimization,performance,Php,Optimization,Performance,(假设php5)考虑 1和2之间有很大区别吗 如果不是,那么1/2到3之间呢?好吧,就像所有“现实生活中什么可能更快”的问题一样,你无法通过现实生活的测试 function timeFunc($function, $runs) { $times = array(); for ($i = 0; $i < $runs; $i++) { $time = microtime(); call_user_func($function); $times[$i]
1和2之间有很大区别吗
如果不是,那么1/2到3之间呢?好吧,就像所有“现实生活中什么可能更快”的问题一样,你无法通过现实生活的测试
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";
function timeFunc($function$runs)
{
$times=array();
对于($i=0;$i<$runs;$i++)
{
$time=microtime();
调用用户函数($function);
$times[$i]=微时间()-$time;
}
返回数组_sum($times)/$runs;
}
函数Method1()
{
$foo=‘一些单词’;
对于($i=0;$i<10000;$i++)
$t=“这些是$foo”;
}
函数方法2()
{
$foo=‘一些单词’;
对于($i=0;$i<10000;$i++)
$t=“这些是{$foo}”;
}
函数方法3()
{
$foo=‘一些单词’;
对于($i=0;$i<10000;$i++)
$t=“这些是”$foo;
}
打印timeFunc('Method1',10)。“\n”;
打印timeFunc('Method2',10)。“\n”;
打印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
函数方法4()
{
$foo=‘一些单词’;
对于($i=0;$i<10000;$i++)
$t='这些是'$foo;
}
打印timeFunc('Method4',10)。“\n”;
结果如下:
0.0014739
0.0015574
0.0011955
0.001169
当您只是声明一个字符串而不需要解析该字符串时,为什么要混淆PHP调试器来解析它呢。我希望你明白我的意思。@Adam的测试
"these are " . $foo
请注意,以下速度更快:
'these are ' . $foo;
这是由于这样一个事实,一个双引号的“字符串”会被计算,其中一个单引号的“字符串”只是按原样处理…不要在PHP中尝试优化字符串操作。如果数据库查询写得不好或者没有使用任何类型的缓存方案,那么连接与插值(在实际性能中)是没有意义的。编写字符串操作的方式应使以后调试代码变得容易,性能差异可以忽略不计
@如果这只是一个关于语言细节的问题,我想没关系。我只是想在对话中补充一点,即在现实世界应用程序中比较单引号、双引号和heredoc之间的性能与实际性能下降(如糟糕的数据库查询)相比毫无意义。性能差异至少是从2012年1月开始的,可能更早:
Single quotes: 0.061846971511841 seconds
Double quotes: 0.061599016189575 seconds
PHP的早期版本可能有所不同——我个人更喜欢单引号而不是双引号,所以这是一个方便的区别。文章的结论提出了一个很好的观点:
永远不要相信你自己没有伪造的统计数据
(尽管文章引用了这句话,但最初的讽刺很可能是对温斯顿·丘吉尔的错误,温斯顿·丘吉尔是约瑟夫·戈培尔的宣传部发明的,目的是把丘吉尔描绘成一个骗子:
我在统计局工作,但我没有工作
这大致可以理解为:“我不相信我没有伪造自己的统计数据。”我似乎记得论坛软件的开发人员Vanilla用单引号替换了代码中的所有双引号,并注意到性能得到了合理的提高 不过,目前我似乎找不到与讨论相关的链接。实时基准:
当用单引号和双引号连接变量时,实际上有一个细微的区别 双引号可以慢得多。我从几个地方读到这样做比较好
'parse me '.$i.' times'
虽然我想说第二个给了你更多可读性的代码。连接变量时会有区别。。。你对结果做了什么。。。如果您正在做的是将其转储到输出,那么是否启用输出缓冲 另外,服务器的内存状况如何?通常,较高级别平台上的内存管理比较低级别平台上的内存管理更糟糕
$a = 'parse' . $this;
正在用户代码平台级别管理内存
$a = "parse $this";
正在php系统代码平台级别管理内存
$a = "parse $this";
因此,这些与CPU相关的基准并不能说明全部情况
运行基准1000次与在试图同时运行相同模拟1000次的服务器上运行基准1000次相比。。。根据应用程序的范围,您可能会得到截然不同的结果。实际上根本没有区别!参见计时:执行时间上的任何差异都可以忽略不计 请看
- 有关PHP中插值和串联的工作原理以及为什么关心它们的速度毫无意义的技术说明
不要在这样的微优化上浪费时间。使用探查器在真实场景中测量应用程序的性能,然后在真正需要它的地方进行优化。与在代码中应用微优化相比,优化单个粗略的DB查询可能会带来更大的性能改进。如果在双引号字符串语法中使用变量,只需在混合中添加其他内容:
$foo = "hello {$bar}";
快于
$foo = "hello $bar";
$foo = 'hello' . $bar;
这两个都比
$foo = "hello $bar";
$foo = 'hello' . $bar;
应该注意的是,当使用e的修改版本时
0.0016254
0.0015719
0.0019806
0.0016495
0.0015608
0.0022755
function Method6(){
$k1 = 'AAA';
for($i = 0; $i < 10000; $i ++)$t = <<<'EOF'
K1=
EOF
.$k1.
<<<'EOF'
K2=
EOF
.$k1;
}
function Method5(){
$k1 = 'AAA';
for($i = 0; $i < 10000; $i ++)$t = <<<EOF
K1= $k1
EOF
.<<<EOF
K2=$k1
EOF;
}