开始/结束标签和性能?

2022-08-30 07:54:47

这可能是一个愚蠢的问题,但作为一个对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

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

谢谢。


答案 1

3个简单的规则,让你把它做好:

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

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

您的问题也是如此。想象一下,你会得到一些不同。即使是大的,比如说,一种方法也快2倍。天哪,2次!我选择它并很好地优化了我的应用程序,它现在将运行速度提高50%!

错了。不是50%。你永远不会注意到甚至测量这种速度增加。因为您优化的部分仅占用整个脚本运行时的 0,0001%。

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

性能分析是性能领域的一个关键词。如果其中没有“分析”一词,则可以毫无疑问地丢弃任何与性能相关的问题。同时,分析不是一门火箭科学。它只是测量脚本不同部分的运行时。可以使用一些分析器(如xdebug)完成,甚至可以手动使用.只有在检测到最慢的部分之后,您才能从测试开始。microtime(1)

在提出性能问题之前,请先学习分析。并学会在没有真正原因的情况下不要问性能问题。

过早的优化是万恶之源——D.Knuth


答案 2

我已经重做了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 
    }
}

持续时间1: 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>';
    }
}

时长2: 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次尝试中是否需要这么多数据,我想我将继续使用许多标签,代码缩进看起来更整洁,“查看源代码”布局更准确


推荐