我以下面三个例子为例,来说下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/ 目录下。
加载四个外部类文件的基本代码:
4个外部类文件的基本代码
A类到D类分别是:
A到D类代码
以上4个空类均可以帮助我们模拟一个需要在主脚本中使用外表PHP文件的PHP脚本。我们排除任何额外的函数调用。专注与使用 require_once()文件的加载。
将每一个类放在单独的文件中: classA.php、classB.php、ClassC.php、classD.php
将这些文件与代码放在同一个目录下。重启WEB服务器,使用ab测试工具进行测试。
ab命令模拟10万个请求,同一时间有5个并发请求,命令终止后,应该可以看到类似如下的结果。
ab -c 5 -n 100000 localhost /index.php
require_once ab 测试结果截图
使用此ab命令测试require_once()。我们可以看到,相应时间为99毫秒。我们的结果还说明,该脚本每秒可以支持100.63个请求。
现在,让我们将require_once()函数调用改成required()。重启WEB服务器,然后重新运行 ab 命令。结果如下所示:
require 测试基本代码片段
每秒可支持的请求数量有所提升,从 100.63增加到了105.44.这个结果还说明,代码的相应时间从最初的99.37毫秒降低到了94.84毫秒,减少了5毫秒。
require ab 测试结果
2、提前计算 for 循环的长度:
在进入循环之前计算循环长度是理工一个可以使用的优化技术。
如下图所示的代码是一个简单的for 循环。它将便利数组$items 并分10此计算出数值。要确定那些地方可以进行优化,你需要一步一步的分析嗲吗做了什么。
没有提前计算数组长度的代码片段
如上,代码循环10次,则count($items )计算10次。
先计算数组长度在循环的代码片段
如上代码,从10此计算数组长度降低到一次计算数组长度。我们可以使用函数 microtime() 来准确的计算出减少9次count()函数调用可以节省多少时间。如下所示:
没有提前计算数组长度时运行时间计算
执行十次该代码并计算平均值,我们得出,10万次循环的总执行时间为0.046毫秒,重启服务器,然我们测试下如下代码,其中包含优化了的for 循环
先计算数组长度后执行时间长度代码片段
我们再次运行10此代码并获取平均值。使用此代码,我们看到,for 循环的平均执行时间为0.0095,减少了0.036毫秒。优化过的代码快了0.036毫秒。
1、使用 foreach 、for 、while 循环访问数组元素。
访问数组数据的方法是可以优化的。方法是使用foreach 循环替代 while 或 for 循环。优化数据访问的方法至关重要。因为很多的web 应用程序需要从数据库或者XML 文件中读取数据并且必须遍历每一条记录后才能将数据显示给用户。为了演示这种优化,我们将使用如下的代码:
foreach 执行时间计算 构造测试代码片段
如上创建了一个数组$items ,其中包含10万个元素,每个元素还有155个字节的字符串,代表数据库中的典型数据。在后该代码设置了开始时间并使用foreach 循环访问数组的每一个元素,最后,我们以毫秒为单位显示所示是时间。我么连续执行10次代码,然后计算出每次执行时间的平均数值,其结果是0.0078毫秒。
while 执行时间计算测试代码片段
重启服务器且运行该代码10此后,我们再次计算平均执行时间。用while 循环访问数组中的单个元素的平均时间为0.0099 毫秒。
最后一组循环比较的是for 循环。我们使用如下代码,按照同样的基准循环流程,重启服务器,执行代码10次并计算:
for 执行时间计算测试代码片段
上述三种循环基准的结果列于如下表中。表宗结果可以证明,使用foreach 循环访问数组是最好的方法。
上万种循环的运行时间比较
从上面的几个例子,我们可以感受到代码优化的重要性。
领取专属 10元无门槛券
私享最新 技术干货