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
聊天室php&amp;mysql(三)
Oct 09 PHP
discuz的php防止sql注入函数
Jan 17 PHP
php中批量删除Mysql中相同前缀的数据表的代码
Jul 01 PHP
PHP多文件上传类实例
Mar 07 PHP
php通过ksort()函数给关联数组按照键排序的方法
Mar 18 PHP
php使用CURL不依赖COOKIEJAR获取COOKIE的方法
Jun 17 PHP
使用PHP和JavaScript判断请求是否来自微信内浏览器
Aug 18 PHP
CodeIgniter配置之database.php用法实例分析
Jan 20 PHP
微信公众号判断用户是否已关注php代码解析
Jun 24 PHP
PHP封装mysqli基于面向对象的mysql数据库操作类与用法示例
Feb 25 PHP
thinkphp框架表单数组实现图片批量上传功能示例
Apr 04 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验证码(支持中文)
2007/02/14 PHP
PHP5 面向对象(学习记录)
2009/12/02 PHP
Php 构造函数construct的前下划线是双的_
2009/12/08 PHP
php中如何使对象可以像数组一样进行foreach循环
2013/08/09 PHP
PHP中数据类型转换的三种方式
2015/04/02 PHP
PHP实现二维数组根据key进行排序的方法
2016/12/30 PHP
PHP substr()函数参数解释及用法讲解
2017/11/23 PHP
jQuery+CSS 实现的超Sexy下拉菜单
2010/01/17 Javascript
JS文本获得焦点清除文本文字的示例代码
2014/01/13 Javascript
一个js过滤空格的小函数
2014/10/10 Javascript
javascript实现图片上传前台页面
2015/08/18 Javascript
jquery实现未经美化的简洁TAB菜单效果
2015/08/28 Javascript
jQuery.form.js插件不能解决连接超时(timeout)的原因分析及解决方法
2016/10/14 Javascript
Node.js中process模块常用的属性和方法
2016/12/13 Javascript
微信小程序 image组件binderror使用例子与js中的onerror区别
2017/02/15 Javascript
Flask中获取小程序Request数据的两种方法
2017/05/12 Javascript
vue中各组件之间传递数据的方法示例
2017/07/27 Javascript
Node.js readline 逐行读取、写入文件内容的示例
2018/03/01 Javascript
详解vantUI框架在vue项目中的应用踩坑
2018/12/06 Javascript
解决 viewer.js 动态更新图片导致无法预览的问题
2019/05/14 Javascript
ionic+html5+API实现双击返回键退出应用
2019/09/17 Javascript
layui时间控件选择时间范围的实现方法
2019/09/28 Javascript
Python中实现参数类型检查的简单方法
2015/04/21 Python
Python实现基于权重的随机数2种方法
2015/04/28 Python
总结Python中逻辑运算符的使用
2015/05/13 Python
详解Django中Request对象的相关用法
2015/07/17 Python
Python基于dom操作xml数据的方法示例
2018/05/12 Python
python爬虫实现获取下一页代码
2020/03/13 Python
Django model重写save方法及update踩坑详解
2020/07/27 Python
名词解释型面试题(主要是网络)
2013/12/27 面试题
预防艾滋病宣传标语
2014/06/25 职场文书
三提三创主题教育活动查摆整改措施
2014/10/25 职场文书
教你修复 Win11应用商店加载空白问题
2021/12/06 数码科技
解决xampp安装后Apache无法启动
2022/03/21 Servers
python APScheduler执行定时任务介绍
2022/04/19 Python
Golang日志包的使用
2022/04/20 Golang