打开/closures标签和性能?
这可能是一个愚蠢的问题,但作为一个相对较新的PHP,我想知道是否有任何性能相关的问题频繁地打开和closuresHTML模板代码中的PHP标签,如果是的话,最好的做法是什么使用PHP标签?
我的问题不是关于结束标记的重要性/正确性,还是关于哪种types的代码比另一种更具可读性,而是关于如何parsing/执行文档以及它可能对性能有什么影响。
为了说明,请考虑以下两个极端:
混合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
如果听到这种说法没有什么区别的话,会对这个问题有些意见感兴趣。
谢谢。
3个简单的规则让你做对:
- 没有语法问题可以影响性能。 数据操作呢。
- 性能的说话只支持分析的结果。
- 不成熟的优化是万恶之源
性能问题很难理解。 build议新手不要把它考虑在内。 因为他们总是被微不足道的东西所折服,却看不到真正重要的东西。 只是因为缺乏经验。
你的问题也一样。 想象一下,你会有所作为。 比方说,一个方法比其他方法快2倍。 哦,我的,两次! 我select它并优化我的应用程序,现在它运行速度会提高50%!
错了 。 不是50%。 你永远不会注意到甚至测量这个速度的增加。 因为你优化了只占整个脚本运行时间的0.0001%的部分。
至于大的HTML表格, 浏览器渲染它需要很长时间。 比你创造的要多得多。
性能分析是性能领域的关键词。 人们可以毫无疑问地抛弃任何与性能有关的问题,如果没有“分析”的话。 同时,剖析不是火箭科学。 我只是测量脚本不同部分的运行时间。 可以使用一些分析器,如xdebug,甚至手动使用microtime(1)
。 只有在检测到最慢的部分后,才可以开始testing。
在提出性能问题之前学习configuration文件。 如果没有真正的理由,学习不要问性能问题。
不成熟的 优化是所有邪恶的根源 – D.Knuth 。
我用50000行重做了testing,并在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>'; } }
持续时间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
由于我怀疑我将需要这么多的数据,我想我会继续使用很多标签,代码缩进看起来更整齐,“查看源代码”布局更准确
您可以轻松忽略这两者之间的性能差异。 有了今天的现代计算资源,差异确实无关紧要。 这种印刷到屏幕的东西真的不用担心。 还有很多你以前应该考虑的其他东西。 除此之外,您的代码的最佳性能和可维护性之间始终存在争议。 你不能总是试图达到最好的性能。 相反,您应该始终考虑性能方面的问题以及您需要花费的时间来改进它们。
易于转换为伪代码的代码更好。 上面的例子certificate了这一点。 哪些需要更长的时间来说?
"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."
关于解释器是如何工作的以及为什么一种方式比另一种方式更快的技术解释对于新手而言是不相干的。 最好只知道经验法则:
- 越简单越好。
- 如果它不适合在一个页面上,那么它太多了(分解)。
- 如果你不能在索引卡上手写伪码,那就太复杂了。
如果整体结果更简单,请使用更多标签。 期。
真正的问题是内存使用。 string连接和质量回应可以按指数增加内存使用量。
如果你垃圾邮件的标签你的代码变得不可读。
最好的解决scheme是使用模板引擎,并避免混合代码和演示文稿。