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 相关文章推荐
cache_lite试用
Feb 14 PHP
php连接mysql数据库代码
Mar 10 PHP
PHP代码保护--Zend Guard的使用详解
Jun 03 PHP
php自动加载机制的深入分析
Jun 08 PHP
PHP strstr 函数判断字符串是否否存在的实例代码
Sep 28 PHP
取得单条网站评论以数组形式进行输出
Jul 28 PHP
php打造智能化的柱状图程序,用于报表等
Jun 19 PHP
WordPress中Gravatar头像缓存到本地及相关优化的技巧
Dec 19 PHP
Laravel 5.4向IoC容器中添加自定义类的方法示例
Aug 15 PHP
PHP抽象类基本用法示例
Dec 28 PHP
php 命名空间(namespace)原理与用法实例小结
Nov 13 PHP
open_basedir restriction in effect. 原因与解决方法
Mar 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
destoon实现会员商铺中指定会员或会员组投放广告的方法
2014/08/21 PHP
thinkPHP统计排行与分页显示功能示例
2016/12/02 PHP
浅谈PHP中pack、unpack的详细用法
2018/03/12 PHP
PHP判断函数是否被定义的方法
2019/06/21 PHP
Javascript学习笔记1 数据类型
2010/01/11 Javascript
parentElement,srcElement的使用小结
2014/01/13 Javascript
jquery实现两边飘浮可关闭的对联广告
2015/11/27 Javascript
jquery实现跳到底部,回到顶部效果的简单实例(类似锚)
2016/07/10 Javascript
详解handlebars+require基本使用方法
2016/12/21 Javascript
几种tab切换详解
2017/02/03 Javascript
Vue.js在使用中的一些注意知识点
2017/04/29 Javascript
微信小程序图片宽100%显示并且不变形
2017/06/21 Javascript
jQuery.extend 与 jQuery.fn.extend的用法及区别实例分析
2018/07/25 jQuery
vue文件运行的方法教学
2019/02/12 Javascript
Jquery属性的获取/设置及样式添加/删除操作技巧分析
2019/12/23 jQuery
微信小程序基于movable-view实现滑动删除效果
2020/01/08 Javascript
通过Kettle自定义jar包供javascript使用
2020/01/29 Javascript
jquery.validate自定义验证用法实例分析【成功提示与择要提示】
2020/06/06 jQuery
关于better-scroll插件的无法滑动bug(2021通过插件解决)
2021/03/01 Javascript
使用go和python递归删除.ds store文件的方法
2014/01/22 Python
centos系统升级python 2.7.3
2014/07/03 Python
Python发送http请求解析返回json的实例
2018/03/26 Python
快速解决PyCharm无法引用matplotlib的问题
2018/05/24 Python
python中使用iterrows()对dataframe进行遍历的实例
2018/06/09 Python
Python中的pathlib.Path为什么不继承str详解
2019/06/23 Python
Python类中方法getitem和getattr详解
2019/08/30 Python
解决Keras自带数据集与预训练model下载太慢问题
2020/06/12 Python
python else语句在循环中的运用详解
2020/07/06 Python
分享全球十款超强HTML5开发工具
2014/05/14 HTML / CSS
爱尔兰领先的在线体育用品零售商:theGAAstore
2018/04/16 全球购物
可持续未来的时尚基础:Alternative Apparel
2019/05/06 全球购物
巴西补充剂和维生素购物网站:Natue
2019/06/17 全球购物
视图的作用
2014/12/19 面试题
介绍一下OSI七层模型
2012/07/03 面试题
小学教师师德演讲稿
2014/05/06 职场文书
见习报告的格式
2014/11/04 职场文书