2010-03-13 118 views
84

这可能是一个愚蠢的问题,但作为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。虽然我不觉得你给出的两个例子是比较理想的一对,但我得到了要点:) – 2010-03-13 03:27:53

+0

谢谢......我碰巧正在处理一个大规模的html表格,并且这个问题有点盯着我。 ..即使这是有点理论上的。 – Tom 2010-03-13 03:29:21

+0

Off topic-ish:您应该使用循环和数据的数组/迭代器来填充表格。 – 2010-03-13 03:43:18

回答

80

3条简单的规则,你得到它的权利:

  • 没有语法问题可能会影响性能。数据操作确实。
  • 性能说话只支持结果性能分析
  • 过早的优化是所有罪恶

性能问题的根本是相当费解。建议新手不要将其考虑在内。因为他们总是被微不足道的东西所折服,并且看不到真正重要的东西。只是因为缺乏经验。

相同您的问题。想象一下你会得到一些改变。比如说,一个方法的速度要快两倍。哦,我的,2次!我选择它并优化我的应用程序,现在它运行速度会提高50%!

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

至于大的HTML表格,浏览器需要很长时间来呈现它。比你创造的要多得多。

性能分析是性能领域的关键词。人们可以毫不怀疑地抛弃任何与性能相关的问题,如果其中没有“分析”这个词。与此同时,剖析并不是火箭科学。我只是测量脚本不同部分的运行时间。可以使用一些分析器来完成,比如xdebug,甚至可以使用microtime(1)来手动完成。只有在检测到最慢的部分后,才可以开始测试。

在提出性能问题之前学习配置文件。 如果没有真正的理由,学习不要问性能问题。

不成熟的优化是所有邪恶的根源 - D.Knuth

+4

为什么如果我使用“基准”而不是“配置文件”这个词这么糟糕?意义有什么不同?希望知道差异:) – NikiC 2010-10-18 19:19:02

+0

+1引用唐纳德克努特和+200非常有见地的答案。 – 2011-05-05 13:41:38

+0

@nikic,Col什么时候说使用“benchmark”这个词不好?听起来像是你把词语放在嘴里,或者在错误的地方引用某些东西。 – 2011-05-06 10:29:42

13

您可以轻松忽略这两者之间的性能差异。凭借今天的现代计算资源,差异确实无关紧要。这种印刷到屏幕的东西真的不用担心。还有很多你应该考虑的其他东西。 除此之外,您的代码的最佳性能和可维护性之间始终存在争议。你不能总是试图达到最佳性能。相反,您应该始终考虑性能问题以及您需要花费的时间来改进它们。

34

我重做测试与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 
    } 
} 

工期: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转到需要这么多的数据,我想我会继续使用许多标签,代码缩进看起来更整齐,“查看源代码”布局更准确

+0

第三个测试用例是将多个echo语句与一个php标签一起使用,因为您不需要使用字符串连接。 – poke 2010-04-26 16:42:34

+1

你没有说你跑了多少次。 – 2010-04-26 16:45:42

+1

非常有趣...感谢您这样做。 – Tom 2010-04-26 18:11:03

5

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

"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

与此有关的真正问题是内存使用。字符串连接和大量回应可以按指数方式增加内存使用量。

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

最好的解决方案是使用模板引擎,并避免混合代码和演示文稿。