我最近在一家公司接受了采访,他们问我以下问题:
“如果服务器/站点优化是最重要的,请编写一个PHP脚本,在垂直行中生成数字1到10 - IE - 1,然后是换行符,然后是2,然后是换行符等。”
虽然我可以用很多方式编写这个程序,但我认为它们在服务器负载和性能方面都不比其他程序好。例如:
for ($i = 1; $i <= 10; $i++) {
echo $i . '<br />';
}
所以我在这里有两个问题:
答案 0 :(得分:5)
希望这是一个棘手的问题。在我看来,正确的反应是问:“印刷这一点文字真的是我们的瓶颈吗?”如果对应用程序的整体速度产生的影响可以忽略不计,那么花费更快的时间就浪费了时间。
另一方面,亚当提出了一个非常好的观点in his answer。编码完成后,很难解决一些瓶颈问题。
尽管如此,以下内容应该更快,主要是因为它减少了解释器开销:
echo "1<br/>2<br/>3<br/>4<br/>5<br/>6<br/>7<br/>8<br/>9<br/>10<br/>";
答案 1 :(得分:5)
在尝试编写高效代码时,我尝试从项目开始就遵循一般做法。
在您提到的示例中,我尝试避免重复调用echo,因为您可以通过构建要呈现的代码然后在一次调用中回显它来实现显着的性能增强。例如:
for ($i = 1, $string = ''; $i <= 10; $i++) {
s .= $i.'<br />';
}
echo $string;
当然,在这个例子中它几乎没有什么区别,但是如果你从一个项目开始就没有遵循这种类型的简单约定,那么你需要进行大规模的重构才能在以后做,而不仅仅是从一开始。
答案 2 :(得分:3)
因为服务器负载是最重要的,所以我认为最便宜的方法是通过网络以极少的CPU负载为用户提供最少的内容。发送直接文本将导致类似大小的程序的CPU负载最轻,因此在这种情况下,我会使用类似于Joey Adams解决方案的解决方案,但我会删除5个字符。此外,我更新了 Peter Taylor的建议使用预标记(48个字符 - 40个网络):
echo "<pre>1\n2\n3\n4\n5\n6\n7\n8\n9\n10</pre>";
在这种情况下这更好,因为要求很短。但是,假设我们想要为服务器优化100个数字和换行符。在这种情况下,如果您在PHP中计算它并通过互联网发送完整结果,那么如果您没有对其进行硬编码,那么这将是9 + 9*3 + 90*4 + 3 = 399
个字符以及计算的额外服务器开销。因此,不是在PHP中执行逻辑,然后将完整结果发送到客户端,您可以向客户端发送一个较小的脚本,为您构建内容,同时减少服务器上的负载。以下是您可以使用PHP构建和发送的JavaScript / HTML示例(136个字符 - 128个网络):
echo "<pre id=\"c\"><\pre><script type=\"text/javascript\">for(i=0;i++<100;){document.getElementById('c').innerHTML+=i+'\n';}</script>";
Here's在行动中看到它的小提琴。
答案 3 :(得分:2)
您的面试官想要以下内容:
1
2
3
4
5
6
7
8
9
10
这是最快速的方式,请放下手。