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 相关文章推荐
一个简单的自动发送邮件系统(二)
Oct 09 PHP
php Sql Server连接失败问题及解决办法
Aug 07 PHP
PHP显示今天、今月、上月、今年的起点/终点时间戳的代码
May 25 PHP
解析PHP汉字转换拼音的类
Jun 18 PHP
php操作mysqli(示例代码)
Oct 28 PHP
php cookie使用方法学习笔记分享
Nov 07 PHP
浅谈PHP调用Webservice思路及源码分享
Jun 04 PHP
html静态页面调用php文件的方法
Nov 13 PHP
PHP结合jQuery实现找回密码
Jul 22 PHP
支付宝服务窗API接口开发php版本
Jul 20 PHP
PHP+Ajax实现上传文件进度条动态显示进度功能
Jun 04 PHP
PHP的PDO连接讲解
Jan 24 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 模拟$_PUT实现代码
2010/03/15 PHP
php array_filter除去数组中的空字符元素
2020/06/21 PHP
解析yii数据库的增删查改
2013/06/20 PHP
PHP 读取大文件的X行到Y行内容的实现代码
2013/06/24 PHP
php将textarea数据提交到mysql出现很多空格的解决方法
2014/12/19 PHP
PHP实现发送邮件的方法(基于简单邮件发送类)
2015/12/17 PHP
动态加载js的几种方法
2006/10/23 Javascript
写自已的js类库需要的核心代码
2012/07/16 Javascript
结合JQ1.9通过js正则判断各种浏览器版本的方法
2013/12/30 Javascript
js判断url是否有效的两种方法
2014/03/04 Javascript
node.js中的path.basename方法使用说明
2014/12/09 Javascript
thinkphp 表名 大小写 窍门
2015/02/01 Javascript
javascript异步处理工作机制详解
2015/04/13 Javascript
jQuery实现鼠标跟随提示层效果代码(可显示文本,Div,Table,Html等)
2016/04/18 Javascript
浅谈regExp的test方法取得的值变化的原因及处理方法
2017/03/01 Javascript
配置一个vue3.0项目的完整步骤
2019/04/26 Javascript
Vue 用Vant实现时间选择器的示例代码
2019/10/25 Javascript
[07:03]显微镜下的DOTA2第九期——430圣堂刺客杀戮秀
2014/06/20 DOTA
python中的global关键字的使用方法
2019/08/20 Python
Pytoch之torchvision.transforms图像变换实例
2019/12/30 Python
python__new__内置静态方法使用解析
2020/01/07 Python
keras topN显示,自编写代码案例
2020/07/03 Python
Python爬虫设置ip代理过程解析
2020/07/20 Python
HTML5+CSS3实现无插件拖拽上传图片(支持预览与批量)
2017/01/05 HTML / CSS
HTML5离线应用与客户端存储的实现
2018/05/03 HTML / CSS
Get The Label中文官网:英国运动时尚购物平台
2017/04/19 全球购物
给水排水工程专业毕业生推荐信
2013/10/28 职场文书
应用化学专业职业生涯规划书
2013/12/31 职场文书
运动会广播稿200米
2014/01/27 职场文书
开展党的群众路线教育实践活动方案
2014/02/05 职场文书
新春联欢会主持词
2014/03/24 职场文书
养牛场项目建议书
2014/05/13 职场文书
节约用水的口号
2014/06/20 职场文书
党员干部对十八届四中全会的期盼
2014/10/17 职场文书
学校实习推荐信
2015/03/27 职场文书
辩护意见书
2015/06/04 职场文书