由于此处描述的好处,我开始将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
答案 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不必要的丑陋是它使用非常有限的唯一原因。
性能差异总是可以忽略不计。