在 php5 中使用内联字符串与串联的速度差异?

2022-08-30 09:54:42

(假设 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之间呢?


答案 1

至少从 2012 年 1 月开始,性能差异就无关紧要了,而且可能更早:

Single quotes: 0.061846971511841 seconds
Double quotes: 0.061599016189575 seconds

PHP的早期版本可能有区别 - 我个人更喜欢单引号而不是双引号,所以这是一个方便的区别。文章的结论提出了一个很好的观点:

永远不要相信你自己没有伪造的统计数据。

(虽然文章引用了这句话,但最初的俏皮话很可能被错误地归因于温斯顿·丘吉尔(Winston Churchill),这是约瑟夫·戈培尔(Joseph Goebbels)的宣传部发明的,旨在将丘吉尔描绘成一个骗子:

Ich traue keiner Statistik, die ich nicht selbst gefälscht habe.

这松散地翻译为,“我不相信我没有伪造自己的统计数据。


答案 2

好吧,就像所有“现实生活中可能更快”的问题一样,您无法通过现实生活中的测试。

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 很昂贵,插值器仍然必须这样做,毕竟需要解析变量并修剪/复制原始字符串。

索姆纳特的更新:

我在上面的实时逻辑中添加了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调试器来解析。我希望你明白我的观点。


推荐