打开/关闭标签和性能?


91

这可能是一个愚蠢的问题,但是作为PHP的新手,我想知道在HTML模板代码中频繁打开和关闭PHP标签是否存在任何与性能相关的问题,如果是的话,最佳实践是什么?使用PHP标签?

我的问题不是关闭标签的重要性/正确性,或者不是哪种类型的代码比另一种更具可读性,而是关于文档的解析/执行方式及其对性能的影响。

为了说明,请考虑以下两个极端:

混合使用PHP和HTML标签:

<?php echo
   '<tr>
       <td>'.$variable1.'</td>
       <td>'.$variable2.'</td>
       <td>'.$variable3.'</td>
       <td>'.$variable4.'</td>
       <td>'.$variable5.'</td>
   </tr>'
?>
// PHP tag opened once

分离PHP和HTML标签:

<tr>
   <td><?php echo $variable1 ?></td>
   <td><?php echo $variable2 ?></td>
   <td><?php echo $variable3 ?></td>
   <td><?php echo $variable4 ?></td>
   <td><?php echo $variable5 ?></td>
</tr>
// PHP tag opened five times

即使只是听说它没有区别,也有兴趣听取一些对此的看法。

谢谢。


9
有趣的问题,为此+1。尽管我认为您提供的两个示例不是比较理想的示例,但我明白了要点:)
好的

谢谢...我碰巧目前正在处理一个巨大的html表,这个问题有点盯着我...即使是有些理论上的问题。
汤姆(Tom)2010年

摆脱主题偏见:您应该使用循环和数据数组/迭代器填充表。
体面的达布尔

@fireeyedboy ...当然,我同意,但这并不总是可行的。从数据库中获取数据时需要杂技,或者HTML结构不能很好地适应循环。
汤姆(Tom)2010年

4
我认为可读性是这里最重要的事情。您不会看到任何微不足道的重大增加或减少。
Chuck Le Butt

Answers:


88

为您准备正确的3条简单规则:

  • 没有语法问题可以影响性能。数据操作确实如此。
  • 说到性能,仅以分析结果为后盾。
  • 过早的优化是万恶之源

性能问题很难理解。建议新手不要考虑它。因为他们总是对琐碎的事情印象深刻,却看不到真正重要的事情。只是因为缺乏经验。

同样的问题。想象一下,您将永远有所不同。例如,即使是一个大方法,其速度也快2倍。哦,我的2次!我选择它并优化了我的应用程序,它现在运行速度提高了50%!

错了。不是50%。您永远不会注意到甚至无法衡量这种速度的提高。因为您优化了仅占整个脚本运行时的0,0001%的零件。

对于大型HTML表,浏览器需要很长时间才能呈现它。比您生成的要多得多。

性能分析是性能界的一个关键词。毫无疑问,如果其中没有“概要分析”一词,就可以毫无疑问地丢弃任何与性能相关的问题。同时,分析不是一门火箭科学。我只是在评估脚本不同部分的运行时间。可以使用诸如xdebug之类的探查器来完成,甚至可以使用来手动完成microtime(1)。而且只有在检测到最慢的部分之后,您才能开始测试。

在询问性能问题之前,先学习剖析。如果没有真正的原因,请学习不要问性能问题。

过早的优化是所有罪恶的根源 - D.Knuth


4
如果我使用“基准”一词而不是“配置文件”,为什么会如此糟糕?含义有什么不同吗?我们将不胜感激:)
NikiC 2010年

+1引用Donald Knuth,+ 200引用非常有见地的答案。
克莱门特·赫雷曼

@ nikic,Col何时说使用“基准”一词不好??听起来您是在向他的嘴巴说话,还是在错误的地方引用了东西。
Chuck Le Butt

10
为什么这个评价很高?它不能以任何形式或形式回答问题。从我-1。
bharal 2012年

2
@NikiC我见过的通常用法:基准测试意味着以某种方式测量或排名代码的整体性能,以便将其与替代解决方案进行比较(例如下面的Amien在回答这个问题时所做的事情),而概要分析则意味着找出代码的哪些部分负责您要解决的任何用户可见的性能问题。区别在于,性能分析与确定性能问题的原因有关,而基准测试与测试解决方案有关。
Mark Amery 2014年

40

我已经重做了50,000行的测试,并且还在1标签方法中添加了多回显

for ($j=0;$j<30;$j++) {
    foreach ($results as $key=>$val){
    ?>
       <tr>
           <td><?php echo $results[$key][0]?></td>
           <td><?php echo $results[$key][1]?></td>
           <td><?php echo $results[$key][2]?></td>
           <td><?php echo $results[$key][3]?></td>
           <td><?php echo $results[$key][4]?></td>
           <td><?php echo $results[$key][5]?></td>
           <td><?php echo $results[$key][6]?></td>
           <td><?php echo $results[$key][7]?></td>
           <td><?php echo $results[$key][8]?></td>
           <td><?php echo $results[$key][9]?></td>
           <td><?php echo $results[$key][10]?></td>
           <td><?php echo $results[$key][11]?></td>
           <td><?php echo $results[$key][12]?></td>
           <td><?php echo $results[$key][13]?></td>
           <td><?php echo $results[$key][14]?></td>              
       </tr>
    <?php 
    }
}

duration1:31.15542483秒

for ($k=0;$k<30;$k++) {
    foreach ($results as $key1=>$val1){
        echo
           '<tr>
               <td>'.$results[$key1][0].'</td>
               <td>'.$results[$key1][1].'</td>
               <td>'.$results[$key1][2].'</td>
               <td>'.$results[$key1][3].'</td>
               <td>'.$results[$key1][4].'</td>
               <td>'.$results[$key1][5].'</td>
               <td>'.$results[$key1][6].'</td>
               <td>'.$results[$key1][7].'</td>
               <td>'.$results[$key1][8].'</td>
               <td>'.$results[$key1][9].'</td>
               <td>'.$results[$key1][10].'</td>
               <td>'.$results[$key1][11].'</td>
               <td>'.$results[$key1][12].'</td>
               <td>'.$results[$key1][13].'</td>
               <td>'.$results[$key1][14].'</td>              
           </tr>';
    }
}

duration2:30.23169804秒

for ($l=0;$l<30;$l++) {
    foreach ($results as $key2=>$val2){     
           echo'<tr>';
               echo'<td>'.$results[$key2][0].'</td>';
               echo'<td>'.$results[$key2][1].'</td>';
               echo'<td>'.$results[$key2][2].'</td>';
               echo'<td>'.$results[$key2][3].'</td>';
               echo'<td>'.$results[$key2][4].'</td>';
               echo'<td>'.$results[$key2][5].'</td>';
               echo'<td>'.$results[$key2][6].'</td>';
               echo'<td>'.$results[$key2][7].'</td>';
               echo'<td>'.$results[$key2][8].'</td>';
               echo'<td>'.$results[$key2][9].'</td>';
               echo'<td>'.$results[$key2][10].'</td>';
               echo'<td>'.$results[$key2][11].'</td>';
               echo'<td>'.$results[$key2][12].'</td>';
               echo'<td>'.$results[$key2][13].'</td>';
               echo'<td>'.$results[$key2][14].'</td>';              
           echo'</tr>';
    }
}

duration3:27.54640007秒

原始的2种方法之间没有太大区别,但是看起来@poke较少的话它要快很多

由于我怀疑我一口气需要这么多的数据,我想我会继续使用很多标签,代码缩进看起来更整洁,“查看源代码”的布局更准确


1
第三个测试用例是使用带有一个php标记的多个echo语句,因为那时您无需使用字符串连接。

我已经重做了50,000行的测试,并且还在1标签方法中添加了多回声
Amien 2010年

5
当我们要优化时,+ 1测量很重要。我们经常意识到这种优化是没有用的。
Luc M

18
从外观上看,前两个示例比上一个示例输出更多的空格。这可能是运行时间较长的原因。
Mike C

echo接受要输出的多个表达式。指标中未考虑具有该功能的变体。
hakre 2012年

13

您可以轻松忽略这两者之间的性能差异。借助当今的现代计算资源,两者之间的差异实际上并不重要。真正不用担心这种打印到屏幕的东西。您还应该考虑其他很多东西。除此之外,在代码的最佳性能和可维护性之间始终存在争论。您不能总是尝试获得最佳性能。相反,您应始终考虑性能问题以及需要花费的时间来改进它们。


6

易于转换为伪代码的代码更好。上面的例子证明了这一点。哪个需要更长的时间?

"Start php, do this 30 times:, then stop php.  Print this.  Start php, print this, stop php. Print this.  Start php, print this, stop php.Print this.  Start php, print this, stop php. Print this.  Start php, print this, stop php.Print this.  Start php, print this, stop php. Print this.  Start php, print this, stop php.Print this.  Start php, print this, stop php..."

"Start php, do this 30 times: print this, then add this to that, then add this to that, then add this to that, then add this to that, then add this to that, then add this to that..."

"Start php, do this 30 times: print this, print this, print this, print this, print this, print this, print this..."

我个人会这样做:

"Start php, define this, do this 30 times: add this to that.  Print." 

关于解释器如何工作以及为什么一种方法比另一种方法更快的技术解释与新手无关。最好只是了解经验法则:

  1. 越简单越好。
  2. 如果它不能放在单个页面上,则说明它做得太多(将其分解)。
  3. 如果您无法在索引卡上手写伪代码,那就太复杂了。

如果整体结果更简单,则使用更多标签。期。


5

真正的问题是内存使用。字符串串联和大量回显可以成倍增加内存使用量。

如果您将垃圾邮件发送给php标签,则您的代码将变得不可读。

最好的解决方案是使用模板引擎,并避免完全混用代码和表示。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.