heredoc比PHP中的逃逸回声慢吗?

时间:2011-11-26 14:20:19

标签: php echo heredoc

由于此处描述的好处,我开始将heredocs合并到我的代码中:What is the advantage of using Heredoc in PHP ?

我想知道heredocs是否比使用带有转义的echo更慢,特别是涉及数千行代码和其他操作时,例如数据库查询,文件I / O,中等大小集合上的循环等等(谢谢@delnan)。 “很多”我的意思是,如果它足以解决性能问题,那么大多数经验丰富的程序员都不会将它用于大型项目[例如创建CMS]。我试过下面的测试。

修改

当然,差异是微秒,下面的测试不是一个很好的例子(我只是想弄清楚自己),但我的问题并不是专门指的是回声字符串。

$echoStmt = "The point of the \"argument\" was to illustrate the use of here documents";

$l = 100;
$start = microtime(TRUE);

while( $l-- ) {
    echo $echoStmt;
}

$end = microtime(TRUE);
$diff = $end - $start;

echo $diff;
// prints 24 microseconds

echo "  |  ";

$l = 100;
$start = microtime(TRUE);

$heredocStmt = <<<EOF
The point of the "argument" was to illustrate the use of here documents
EOF;

while( $l-- ) {
    echo $heredocStmt;
}

$end = microtime(TRUE);
$diff = $end - $start;
echo $diff;
// prints 220 microseconds

6 个答案:

答案 0 :(得分:3)

如果是PHP,那么保证还有其他更重要的事情值得优化。我不会出汗HEREDOC sttrings ..

答案 1 :(得分:2)

你正在使用microtime()错误,所以你的结果完全没用/毫无意义。当您使用裸microtime()时,您将获得一个格式为usec sec的STRING。您需要使用microtime(TRUE)来获取可以直接减去的真正浮点数。

e.g。你可能会得到

$start = '999 100'  // 100.999 seconds
$end  = '001 101' // 101.001 seconds

$diff = 001 - 999 = -998 microseconds; // huh?

$start = microtime(TRUE); // 100.999
$end = microtime(TRUE) ; // 101.001;
$diff = 101.001 - 100.999 = 0.002; // proper result.

答案 2 :(得分:2)

算一算:微秒是one millionth of a second

即使有数百行,任何性能差异(如果确实有一个 - 请参阅@NikiC和@ Marc的答案)都无关紧要。使用最易读,易懂和最佳可记录的形式。

在PHP脚本中有更多昂贵的操作值得优化 - 在列表之上通常是数据库调用。

答案 3 :(得分:2)

字符串在编译时被解析,因此您的代码测试的只是查找变量并回显它的时间 - 仅此而已。如果你想测量解析时间差异,你需要挂钩zend_language_scanner - 并且会发现没有可衡量的差异。

答案 4 :(得分:0)

如果您正在使用eaccelerator之类的优化器,那么完全没有任何区别,因为文档的编译版本无论如何都会将它们视为字符串。在编写脚本时,可能有百万分之一秒的时间差,但我不会太在意。

答案 5 :(得分:-1)

我不明白你在说什么“好处”。

回答中的每一个好处都只是作弊 - 这个家伙采取了最糟糕的选择并将其与heredoc进行了比较!即便如此,heredoc变得更加丑陋。

事实上,所有示例都使用字符串更简洁和可读,而不是heredoc:

$sql = <<<SQL
select *
  from $tablename
 where id in [$order_ids_list]
   and product_name = "widgets"
SQL;

VS

$sql = "select * from $tablename
          where id in [$order_ids_list]
           and product_name = 'widgets'";

或。单行

$x = 'The point of the "argument" was to illustrate the use of here documents';

vs 3-liner

$x = <<<EOF
The point of the "argument" was to illustrate the use of here documents
EOF;

这些好处在哪里?!

所以,heredoc不必要的丑陋是它使用非常有限的唯一原因。

性能差异总是可以忽略不计。