这可能是一个愚蠢的问题,但作为一个相对较新的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
有兴趣听到一些关于此的观点,即使只是听到它没有任何区别。
感谢。
答案 0 :(得分:83)
3条简单的规则让你做对:
性能问题很难理解。建议新手不要将其考虑在内。因为他们总是对小事感到印象深刻而且看不到真正重要的事情。仅仅因为缺乏经验。
同样的问题。想象一下,你会有所不同。比如说一个方法,即使是一个方法也要快2倍。哦,我的,2次!我选择它并优化我的应用程序,它现在将快50%!
<强>错误即可。不是50%。你永远不会注意到甚至测量这种速度增加。因为您优化了仅占整个脚本运行时的0,0001%的部件。
对于大型HTML表格,浏览器需要很长时间才能呈现它。远远超过你的生成。
分析是表演界的关键词。如果没有“剖析”字样,人们可以毫不怀疑地删除任何与性能相关的问题。
同时剖析不是火箭科学。我只是测量脚本不同部分的运行时间。可以使用某些分析器(如xdebug)完成,甚至可以使用microtime(1)
手动完成。只有在检测到最慢的部分后,才可以从测试开始。
在询问表演问题之前学习简介。 如果没有真正的理由,请学会不要提出表现问题。
过早优化是所有邪恶的根源 - D.Knuth。
答案 1 :(得分:39)
我用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>';
}
}
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
由于我怀疑我需要这么多数据,我想我会继续使用很多标签,代码缩进看起来更整洁,“查看源”布局更准确
答案 2 :(得分:13)
您可以轻松忽略这两者之间的性能差异。凭借当今的现代计算资源,差异确实无关紧要。这种打印到屏幕的东西真的不用担心。你以前应该考虑很多其他的东西。 除此之外,代码的最佳性能和可维护性之间始终存在争议。您无法始终尝试获得最佳性能。相反,您应该始终考虑性能问题以及您需要花费多少时间来改进它们。
答案 3 :(得分: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."
关于解释器如何工作以及为什么一种方式比另一种方式更快的技术解释与新手无关。最好只知道经验法则:
如果整体结果更简单,请使用更多标签。周期。
答案 4 :(得分:5)
真正的问题是内存使用。字符串连接和质量回显可以指数级地增加内存使用。
如果您对php标记发送垃圾邮件,则代码将变得不可读。
最佳解决方案是使用模板引擎,避免混合代码和演示文稿。