【问题标题】:Is there a speed difference between <?php echo $var; ?> and <?=$var?>?<?php echo $var; 之间是否存在速度差异? ?> 和 <?=$var?>?
【发布时间】:2010-10-14 08:32:32
【问题描述】:

这两个版本有速度差异吗?

<?php echo $var; ?>

<?=$var?>

你推荐哪个,为什么?

【问题讨论】:

  • 我喜欢简短的语法。它更干净。

标签: php syntax php-shorttags


【解决方案1】:

这两行代码完全相同。

我添加了一个较晚的答案,因为还没有人证明这一点,但答案是明确的不,没有性能差异,特别是因为没有差异根本 PHP 是如何执行这两行代码的。

解释器在这两种情况下都能看到相同的代码。解析器产生完全相同的AST,因为&lt;?=&lt;?php echo 基本相同。当您编写 &lt;?=&lt;?php echo 时,解释器运行的指令没有区别。

通过安装php-ast,您可以检查两行代码生成的AST。

鉴于这两种情况...

# CASE 1
<?php echo $i %>

# CASE 2
<?= $i ?>

两者的抽象语法树相同

case 1
AST_STMT_LIST
    0: AST_ECHO
        expr: AST_VAR
            name: "i"
case 2
AST_STMT_LIST
    0: AST_ECHO
        expr: AST_VAR
            name: "i"

这意味着 PHP 在运行时无法区分它们之间的区别,更不用说遇到某种性能差异了。

产生这个输出的代码如下,使用util.php:

<?php
require('util.php');

echo "case 1\n";
echo ast_dump(ast\parse_code('<?php echo $i ?>', $version=50));

echo "\n";

echo "case 2\n";
echo ast_dump(ast\parse_code('<?= $i ?>', $version=50));

echo "\n";

优化在这里无关紧要。选择取决于个人喜好,特别是因为 &lt;?= 始终可用,与短标签无关,从未被弃用,也不会从语言中删除。

【讨论】:

    【解决方案2】:

    从技术上讲,解析器必须解析较长版本的每个字符,并且每次传输都会多出几个字符。

    如果您的网络服务器没有“预编译”(即:缓存标记化的 PHP 页面),那么性能会略有不同。除非您开始谈论数十亿次运行,否则这应该是微不足道的。

    【讨论】:

    • 当你有数十亿次运行时,你不会/不应该使用 PHP。
    • @tstenner:Facebook 不同意你的观点。
    • 投入足够多的硬件...有时开发人员的时间可能比更多的硬件更昂贵,如果您可以简单地通过硬件进行扩展,那么重构所有代码以获得更好的性能是不明智的。尽管如此,他们还是使用 php 优化器...
    • 我认为通过输入更少的字符来节省时间,从而更快地将代码投入生产,将足以抵消应用程序生命周期内微不足道的性能损失。
    • @meagar 让我重新表述一下。我宁愿拥有高性能的代码,而不是可以更快键入的代码。欲速则不达。短代码本身可能无关紧要,但在一百万条记录的循环中,肯定会出现一些性能问题。
    【解决方案3】:

    性能差异微不足道。此外,使用 APC,性能差异为零,零,无。

    短标签在 XML 中存在问题,因为&lt;? 也是 XML 处理标签的标记。因此,如果您正在编写应该可移植的代码,请使用长格式。

    参见http://www.php.net/manual/en/ini.core.php 中的short_open_tag 描述

    【讨论】:

    • 我总是使用简写形式。如果我需要在未启用的地方运行代码,或者在需要 XML 时运行代码(这两种情况都没有发生过),这是 s//
    • @cletus:恕我直言,你没有任何想法。
    • @vartec 恕我直言,PHP 作为没有短开放标签的模板语言毫无用处。 没有令人信服的理由不使用它们。
    • @vartec 是的,我有,我的评论中没有任何其他建议。你有意见吗?
    • @vartec 编写 PHP 模板的最佳语言一直是 PHP。重要的是将您的业务逻辑与您的表示逻辑分开,如果您正在编写 template 文件,那么您已经在这样做了。完全有可能在不诉诸ridiculous template language 写成template language 的情况下实现这种分离。如果您需要以这种方式人为地削弱自己以避免将业务逻辑转储到模板中,那是您的错,而不是 PHP。
    【解决方案4】:

    在 php 5.3 short tag ASP-style 支持将被弃用,尽量避免这种情况并将代码重写为'&lt;?php echo' format,因为你不能使用&lt;?xml ?&gt; inline 例如。

    【讨论】:

    • 又一个来自 PHP 的天才的想法... :|
    • 据我所知,它不会被删除,只是默认关闭。有区别。
    • 这使答案或多或少 FUD。不错。
    • 不,他们不会。 PHP 的短标签从来没有被砍过,拜托,拜托停止传播这种错误信息。唯一考虑删除的标签是 ASP 样式的标签:&lt;% %&gt;
    【解决方案5】:

    不要试图用这些来优化,没用的。相反,停用 allow_short_tags(因为加载 XML 文件时出现问题)并编写干净、可读和可理解的代码。

    即使可能有细微的差别(绝对低于 10%),用它来优化也没有用。如果您的脚本很慢,请先查看您的循环。大多数情况下,通过优化程序流程比使用奇怪的语法可以获得更多的性能。

    【讨论】:

    • 10% 比使用&lt;?php 而不是&lt;? 所遭受的实际性能损失高出许多 个数量级。它甚至在任何实际应用程序中都无法测量。
    【解决方案6】:

    速度差异取决于您输入这 9 个额外字符的速度。
    它还可以提高代码的可读性,但这值得商榷。

    如果您谈论的是执行速度,则没有明显差异。

    【讨论】:

      【解决方案7】:

      你推荐哪个

      不会,除非你真的想允许 HTML 注入。 (99% 的情况下,你不会。)

      <?php echo htmlspecialchars($var); ?>
      

      或者定义一个使用较短名称执行 echo(htmlspecialchars($arg)) 的函数以避免所有输入。

      【讨论】:

      • 此时,我的所有变量都干净且安全 :).. 所以我只需打印出来..
      • @bobince 这是一个严重的偏执狂……你在你所有的变量上都使用 htmlspecialchars() 吗?
      • @jcinacio — 如果变量被回显到客户端并且没有被有意构造为包含 HTML,是的,您确实应该首先对其进行编码。这可能是一个非常严重的安全问题。
      • @jcinacio:是的,当然(除非我明确需要输出原始 HTML,这种情况比较少见)。所有输出到 HTML 的文本都必须转义,就像所有输出到 SQL 的文本一样。错过一个,你就有一个安全漏洞,所以即使是已知安全的变量,也最容易总是使用它。
      • @bobince:在已经被 html 转义的变量上使用 htmlspecialchars 是一个错误。您将获得双编码输出(例如 > 将转换为 &gt;,然后将显示为 > 而不是 >)
      【解决方案8】:

      我认为第二个需要将 short_open_tag(在 PHP.ini 中)设置为 true。

      意味着它有可能在某些网络服务器上被关闭。

      【讨论】:

      • 这不是真的。 &lt;?= 始终可用,与short_open_tag 无关。
      • 自 PHP 5.4 起不再适用
      【解决方案9】:

      在性能方面它是微不足道的。

      正确的用法是使用较长的,因为它更便携。亲身?我做短一点的。

      【讨论】:

        【解决方案10】:

        不,它们是相同的。如果您喜欢打字很多,请使用&lt;?php echo $var; ?&gt;,否则只需使用&lt;?=$var?&gt; 节省时间。

        【讨论】:

          猜你喜欢
          • 2014-02-23
          • 1970-01-01
          • 2015-04-19
          • 1970-01-01
          • 2015-02-05
          • 1970-01-01
          • 2017-06-19
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多