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 相关文章推荐
一个php作的文本留言本的例子(三)
Oct 09 PHP
深入探讨:Nginx 502 Bad Gateway错误的解决方法
Jun 03 PHP
解析PHP汉字转换拼音的类
Jun 18 PHP
PHP的PSR规范中文版
Sep 28 PHP
PHP获取当前url的具体方法全面解析
Nov 26 PHP
PHP将字符分解为多个字符串的方法
Nov 22 PHP
ThinkPHP独立分组使用的注意事项
Nov 25 PHP
Yii控制器中filter过滤器用法分析
Jul 15 PHP
php文件上传 你真的掌握了吗
Nov 28 PHP
Yii框架引用插件和ckeditor中body与P标签去除的方法
Jan 19 PHP
php输出文字乱码的解决方法
Oct 04 PHP
Yii 框架控制器创建使用及控制器响应操作示例
Oct 14 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获取参数的几种方法总结
2014/02/18 PHP
php实现遍历多维数组的方法
2015/11/25 PHP
用js实现控制内容的向上向下滚动效果
2007/06/26 Javascript
面向对象的Javascript之二(接口实现介绍)
2012/01/27 Javascript
js处理自己不能定义二维数组的方法详解
2014/03/03 Javascript
JSONP跨域请求实例详解
2016/07/04 Javascript
jQuery多个版本和其他js库冲突的解决方法
2016/08/11 Javascript
jQuery中clone()函数实现表单中增加和减少输入项
2017/05/13 jQuery
js禁止Backspace键使浏览器后退的实现方法
2017/09/01 Javascript
利用JQUERY实现多个AJAX请求等待的实例
2017/12/14 jQuery
在vue项目中使用element-ui的Upload上传组件的示例
2018/02/08 Javascript
vue.js2.0 实现better-scroll的滚动效果实例详解
2018/08/13 Javascript
ES6基础之字符串和函数的拓展详解
2019/08/22 Javascript
解决vue字符串换行问题(绝对管用)
2020/08/06 Javascript
使用IPython来操作Docker容器的入门指引
2015/04/08 Python
python中map、any、all函数用法分析
2015/04/21 Python
python安装以及IDE的配置教程
2015/04/29 Python
Python用threading实现多线程详解
2017/02/03 Python
python或C++读取指定文件夹下的所有图片
2019/08/31 Python
Python-Flask:动态创建表的示例详解
2019/11/22 Python
Python while循环使用else语句代码实例
2020/02/07 Python
pytorch实现MNIST手写体识别
2020/02/14 Python
计算Python Numpy向量之间的欧氏距离实例
2020/05/22 Python
解决pycharm debug时界面下方不出现step等按钮及变量值的问题
2020/06/09 Python
HTML5实现的震撼3D焦点图动画的示例代码
2019/09/26 HTML / CSS
爱尔兰家电数码商城:Currys PC World爱尔兰
2016/07/23 全球购物
销售经理工作职责
2014/02/03 职场文书
工程专业应届生求职信
2014/02/19 职场文书
人力资源部经理助理岗位职责
2014/03/04 职场文书
小学一年级评语大全
2014/04/22 职场文书
村干部培训方案
2014/05/02 职场文书
校园环保建议书
2014/05/14 职场文书
党校个人总结
2015/03/04 职场文书
化工厂员工工作总结
2015/10/15 职场文书
Python下opencv使用hough变换检测直线与圆
2021/06/18 Python
Java新手教程之ArrayList的基本使用
2021/06/20 Java/Android