我以下面三个例子为例,来说下PHP代码优化。
1、使用require与使用require_once的对比。
2、提前计算一个for循环的长度。
3、比较for、foreach和while循环在访问数组元素时的性能。
在这里,具体的理论东西我不会太多说。我将从实际代码的角度让大家比较直观的了解下那个是最佳的代码实践。能够认识到代码的不同写法确实能给我们的整体性能带来提升。
PHP性能调优之PHP代码最佳实践除此之外,还有一些其他的优化技术,比如file_get_contents获取内容的问题。使用逗号而不是句点来链接字符串,或者在字符串包含变量时使用双引好而不是单引号等等。这些大家可以自己在工作中测试和验证一下。
1、require与require_once。
说明,我的测试文件路径存放在了:/var/shared/htdocs/myapp/models/MyModels/目录下。
加载四个外部类文件的基本代码:
require_once代码片段A类到D类分别是:
A到D类的代码片段以上4个空类均可以帮助我们模拟一个需要在主脚本中使用外表PHP文件的PHP脚本。我们排除任何额外的函数调用。专注与使用require_once()文件的加载。
将每一个类放在单独的文件中:classA.php、classB.php、ClassC.php、classD.php
将这些文件与代码放在同一个目录下。重启WEB服务器,使用ab测试工具进行测试。
ab命令模拟10万个请求,同一时间有5个并发请求,命令终止后,应该可以看到类似如下的结果。
ab-c5-nlocalhost/index.php
require_onceab测试结果截图使用此ab命令测试require_once()。我们可以看到,相应时间为99毫秒。我们的结果还说明,该脚本每秒可以支持.63个请求。
现在,让我们将require_once()函数调用改成required()。重启WEB服务器,然后重新运行ab命令。结果如下所示:
require代码片段每秒可支持的请求数量有所提升,从.63增加到了.44.这个结果还说明,代码的相应时间从最初的99.37毫秒降低到了94.84毫秒,减少了5毫秒。
requireab测试结果截图2、提前计算for循环的长度:
在进入循环之前计算循环长度是理工一个可以使用的优化技术。
如下图所示的代码是一个简单的for循环。它将便利数组$items并分10此计算出数值。要确定那些地方可以进行优化,你需要一步一步的分析嗲吗做了什么。
没有提前计算数组长度模拟代码片段如上,代码循环10次,则count($items)计算10次。
如上代码,从10此计算数组长度降低到一次计算数组长度。我们可以使用函数microtime()来准确的计算出减少9次count()函数调用可以节省多少时间。如下所示:
计算没有提前计算数组长度时候执行时间片段执行十次该代码并计算平均值,我们得出,10万次循环的总执行时间为0.毫秒,重启服务器,然我们测试下如下代码,其中包含优化了的for循环
提前计算过数组长度执行时间代码片段我们再次运行10此代码并获取平均值。使用此代码,我们看到,for循环的平均执行时间为0.,减少了0.毫秒。优化过的代码快了0.毫秒。
3、使用foreach、for、while循环访问数组元素。
访问数组数据的方法是可以优化的。方法是使用foreach循环替代while或for循环。优化数据访问的方法至关重要。因为很多的web应用程序需要从数据库或者XML文件中读取数据并且必须遍历每一条记录后才能将数据显示给用户。为了演示这种优化,我们将使用如下的代码:
foreach循环代码片段如上创建了一个数组$items,其中包含10万个元素,每个元素还有个字节的字符串,代表数据库中的典型数据。在后该代码设置了开始时间并使用foreach循环访问数组的每一个元素,最后,我们以毫秒为单位显示所示是时间。我么连续执行10次代码,然后计算出每次执行时间的平均数值,其结果是0.毫秒。
while循环代码片段重启服务器且运行该代码10此后,我们再次计算平均执行时间。用while循环访问数组中的单个元素的平均时间为0.毫秒。
最后一组循环比较的是for循环。我们使用如下代码,按照同样的基准循环流程,重启服务器,执行代码10次并计算:
for循环执行时间代码片段上述三种循环基准的结果列于如下表中。表宗结果可以证明,使用foreach循环访问数组是最好的方法。
三种循环执行时间比较从上面的几个例子,我们可以感受到代码优化的重要性。