php提高脚本性能的4个技巧


Posted in PHP onAugust 18, 2020

通常,我使用明显的常规PHP函数编写代码来解决相应的问题。但是对于其中的一些问题,我遇到了一些替代解决方案,这些解决方案特别提高了性能。

在本文中,我想介绍一些替代方案。如果您正在寻找可能减少生产中执行时间的可能性,这将很有用。让我们看看,哪种PHP方法可能会被性能更高的方法所取代,以及是否存在成本或折衷的问题。

1.删除重复项

您有一个包含重复项的大型数组,并且希望删除它们,使其仅具有唯一值的数组。

常规

array_unique($array);

替代

array_keys(array_flip($array));

表现

我创建了一个数组,其中包含超过400万个元素和300万个重复项。这是最佳结果:

方法 执行时间处理时间
array_unique 787.31毫秒
array_keys array_flip 434.03毫秒

替代方法在此测量中快 1.8倍 (44.87%)。平均而言,速度提高了约1.5倍(30%)。权衡:这仅适用于简单的一维数组,因为 array_flip 用值替换了键。

2.获取随机数组记录

您有一个很大的数组,想要从中选择一个随机值。

常规

array_rand($array);

替代

$array[mt_rand(0, count($array) - 1)];

表现

我创建了一个包含500万个元素的数组。这是最佳结果:

方法 执行时间处理时间
array_rand 25.99微秒
mt_rand 0.95微秒

替代方法是此测量速度快 27.3倍 (96.33%)。平均而言,速度提高了约8倍(87%)。这个结果特别令人惊讶,因为 mt_rand Mersenne Twister随机数生成器的实现也是如此,并且自PHP 7.1起,内部随机化算法已更改为使用完全相同的算法。

3.测试字母数字字符

您有一个字符串,要测试,如果它仅包含字母数字字符。

常规

preg_match('/^[a-zA-Z0-9]+$/', $string);

替代

ctype_alnum($string);

表现

我创建了一个包含100k以上字母数字和非字母数字字符串的数组。这是最佳结果:

方法 执行时间处理时间
preg_match 15.39毫秒
ctype_alnum 2.06毫秒

在此测量中,替代方法快了 7.5倍 (86.59%)。平均而言,速度提高了约4倍(76%)。可以将相同的内容应用于 ctype_alpha() (检查字母字符)和 ctype_digit() (检查数字字符)。

4.替换子字符串

您有一个字符串,想要用另一个子字符串替换它的一部分。

常规

str_replace('a', 'b', $string);

替代

strtr($string, 'a', 'b');

表现

我创建了一个包含500万个随机字符串的数组。这是最佳结果:

方法 执行时间处理时间
str_replace 676.59毫秒
strtr 305.59毫秒

另一种方法是 2.2倍 (54.83%)在该测量更快。平均而言,速度提高了约2倍(51%)。

其他性能改进

这是我整合到我的编码约定中的一些其他要点,发现它们可以稍微改善性能(如果适用):

  • 首选JSON比XML
  • 在循环之前而不是在循环的每个迭代中声明变量
  • 避免在循环头中进行函数调用(在每次迭代中均
  • for ($i=0; $i<count($array); $i) count() get中调用)
  • 重置内存消耗变量
  • 优先选择 select 语句而不是多个 if 语句
  • 优先于 require / include 而不是 require_once / include_once (确保适当的操作码缓存)

最后几句话:我知道有关过早优化的讨论。我同意生产中的性能取决于瓶颈,例如数据库查询,在处理性能时应重点关注。但是我认为,如果有更快的替代方法,例如在正则表达式更易于处理和维护的情况下,为什么不使用它们呢?

最后

我们已经看到,即使使用当前的PHP 7.4(已经比以前的PHP版本快很多),也可以通过其他方法来提高脚本性能。如果您想亲自验证本文中提供的数据,我创建了一个包含所有测试的存储库:

devmount/faster-php

测试提高 PHP 脚本性能的不同方法

我使用了Bart van Hoekelen的出色工具来衡量执行时间。

以上就是php提高脚本性能的4个技巧的详细内容,更多关于php提高脚本性能的资料请关注三水点靠木其它相关文章!

PHP 相关文章推荐
一个好用的分页函数
Nov 16 PHP
新安装的MySQL数据库需要注意的安全知识
Jul 30 PHP
php array的学习笔记
May 10 PHP
php验证是否是md5编码的简单代码
Apr 01 PHP
ThinkPHP实现将SESSION存入MYSQL的方法
Jul 22 PHP
phpnow php探针环境检测代码
Nov 04 PHP
配置php.ini实现PHP文件上传功能
Nov 27 PHP
thinkphp如何获取客户端IP
Nov 03 PHP
PHP5.3新特性小结
Feb 14 PHP
SSO单点登录的PHP实现方法(Laravel框架)
Mar 23 PHP
PHP单例模式是什么 php实现单例模式的方法
May 14 PHP
详解php框架Yaf路由重写
Jun 20 PHP
php判断IP地址是否在多个IP段内
Aug 18 #PHP
PHP 8新特性简介
Aug 18 #PHP
PHP大文件及断点续传下载实现代码
Aug 18 #PHP
基于thinkphp5框架实现微信小程序支付 退款 订单查询 退款查询操作
Aug 17 #PHP
PhpStorm2020.1 安装 debug - Postman 调用的详细教程
Aug 17 #PHP
php开发最强大的IDE编辑的phpstorm 2020.2配置Xdebug调试的详细教程
Aug 17 #PHP
PHP unset函数原理及使用方法解析
Aug 14 #PHP
You might like
php 远程图片保存到本地的函数类
2008/12/08 PHP
PHP 面向对象实现代码
2009/11/11 PHP
PHP设计模式之装饰者模式
2012/02/29 PHP
浅析PHP中的i++与++i的区别及效率
2016/06/15 PHP
jQuery 学习6 操纵元素显示效果的函数
2010/02/07 Javascript
JavaScript类和继承 constructor属性
2010/03/04 Javascript
jQuery.Autocomplete实现自动完成功能(详解)
2010/07/13 Javascript
浅析JavaScript事件和方法
2015/02/28 Javascript
javascript获取本机操作系统类型的方法
2015/08/13 Javascript
Bootstrap编写一个同时适用于PC、平板、手机的登陆页面
2016/06/30 Javascript
微信小程序(应用号)开发新闻客户端实例
2016/10/24 Javascript
基于JS实现仿京东搜索栏随滑动透明度渐变效果
2017/07/10 Javascript
通过源码分析Vue的双向数据绑定详解
2017/09/24 Javascript
vscode下vue项目中eslint的使用方法
2019/01/13 Javascript
layui表格 返回的数据状态异常的解决方法
2019/09/10 Javascript
ant design实现圈选功能
2019/12/17 Javascript
python 查找文件夹下所有文件 实现代码
2009/07/01 Python
python实现ftp客户端示例分享
2014/02/17 Python
python中的多重继承实例讲解
2014/09/28 Python
Python易忽视知识点小结
2015/05/25 Python
Django使用paginator插件实现翻页功能的实例
2018/10/24 Python
Django 创建新App及其常用命令的实现方法
2019/08/04 Python
关于多元线性回归分析——Python&amp;SPSS
2020/02/24 Python
Python+OpenCV实现图像的全景拼接
2020/03/05 Python
django模型动态修改参数,增加 filter 字段的方式
2020/03/16 Python
基于Pytorch版yolov5的滑块验证码破解思路详解
2021/02/25 Python
HTML5注册表单的自动聚焦与占位文本示例代码
2013/07/19 HTML / CSS
乡镇庆八一活动方案
2014/02/02 职场文书
探亲假请假条
2014/04/11 职场文书
运动会方队口号
2014/06/07 职场文书
施工安全协议书范本
2014/09/26 职场文书
个人买房协议书范本
2014/10/06 职场文书
2014年个人委托书范本
2014/10/13 职场文书
民事诉讼代理词
2015/05/25 职场文书
立秋之描写立秋的作文(五年级)
2019/08/08 职场文书
Java org.w3c.dom.Document 类方法引用报错
2021/08/07 Java/Android