代码之家  ›  专栏  ›  技术社区  ›  Tom

打开/关闭标签和性能?

  •  87
  • Tom  · 技术社区  · 14 年前

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

    会有兴趣听到一些关于这个的观点,即使只是听到它没有区别。

    谢谢。

    5 回复  |  直到 9 年前
        1
  •  82
  •   Your Common Sense    9 年前

    3个简单的规则让你做对:

    • 语法问题不会影响性能。数据操作可以。
    • 说到绩效,只有 仿形 .
    • 过早优化是万恶之源

    性能问题很难理解。建议新手不要考虑到这一点。因为他们总是被琐事打动,看不到真正重要的事情。只是因为缺乏经验。

    你的问题也是。想象一下你会有什么不同。即使是大的,比如说,一种方法也要快两倍。天哪,两次!我选择了它并优化了我的应用程序,它现在将运行速度提高50%!

    错误的 . 不是50%。你永远不会注意到甚至测量到这个速度的增加。因为优化的部分只占整个脚本运行时的00001%。

    对于大型html表,需要很长时间 浏览器 渲染它。比你想象的要多得多。

    分析是性能领域的一个关键词。如果没有“profiling”这个词的话,你可以毫无疑问地丢弃任何与性能相关的问题。 同时,剖面分析并不是一门火箭科学。我只是在测量你脚本不同部分的运行时间。可以使用某些探查器(如xdebug)完成,甚至可以使用 microtime(1) . 只有在检测到最慢的部分之后,才能开始测试。

    在问性能问题之前,先学习分析。 如果没有真正的原因,就不要问表演问题。

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

        2
  •  37
  •   Amien    14 年前

    我已经用50000行重新进行了测试,并添加了multi-echo-in-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>';
        }
    }
    

    持续时间3:27.54640007秒

    最初的两个方法之间没有太大的区别,但是看起来它在减少@poke连接的情况下要快得多

    因为我怀疑我会在一次访问中需要这么多数据,我想我会继续使用许多标记,代码缩进看起来更整洁,并且“查看源”布局更精确

        3
  •  13
  •   pars    9 年前

    你很容易忽略这两者的性能差异。在当今的现代计算资源下,两者之间的差异真的无关紧要。这种打印到屏幕的东西真的不用担心。有很多其他的事情你应该考虑之前。 除此之外,在代码的最佳性能和可维护性之间始终存在争论。你不能总是试图取得最好的成绩。相反,您应该始终考虑性能问题以及需要花费多少时间来改进它们。

        4
  •  5
  •   Jon Egerton Aditya kumar sahoo    12 年前

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

    "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
  •  5
  •   Martien de Jong    12 年前

    真正的问题是内存的使用。字符串连接和大规模回送可以成倍增加内存使用。

    如果你垃圾邮件的php标签,你的代码变得不可读。

    最好的解决方案是使用模板引擎,避免代码和表示混合在一起。