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删除页面记录 同时刷新页面 删除条件用GET方式获得
Jan 10 PHP
php IP转换整形(ip2long)的详解
Jun 06 PHP
解析php利用正则表达式解决采集内容排版的问题
Jun 20 PHP
ThinkPHP添加更新标签的方法
Dec 05 PHP
yii2实现根据时间搜索的方法
May 25 PHP
Yii CDBCriteria常用方法实例小结
Jan 19 PHP
php实现socket推送技术的示例
Dec 20 PHP
php 读写json文件及修改json的方法
Mar 07 PHP
一次因composer错误使用引发的问题与解决
Mar 06 PHP
Laravel框架实现文件上传的方法分析
Sep 29 PHP
Thinkphp5.0 框架使用模型Model添加、更新、删除数据操作详解
Oct 11 PHP
微信小程序结合ThinkPHP5授权登陆后获取手机号
Nov 23 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
关于文本留言本的分页代码
2006/10/09 PHP
解析php中的fopen()函数用打开文件模式说明
2013/06/20 PHP
javascript 对表格的行和列都能加亮显示
2008/12/26 Javascript
Jquery中获取iframe的代码
2011/01/11 Javascript
javascript 主动派发事件总结
2011/08/09 Javascript
使用jquery实现图文切换效果另加特效
2013/01/20 Javascript
加载列表时jquery获取ul中第一个li的属性
2014/11/02 Javascript
js随机生成网页背景颜色的方法
2015/02/26 Javascript
使用npm发布Node.JS程序包教程
2015/03/02 Javascript
javascript常用方法总结
2015/05/14 Javascript
理解JavaScript的变量的入门教程
2015/07/07 Javascript
javascript实现简单计算器效果【推荐】
2016/04/19 Javascript
Java与JavaScript中判断两字符串是否相等的区别
2017/03/13 Javascript
jquery append与appendTo方法比较
2017/05/24 jQuery
AngularJS中ng-class用法实例分析
2017/07/06 Javascript
详解vue-cli 构建Vue项目遇到的坑
2017/08/30 Javascript
极简主义法编写JavaScript类
2017/11/02 Javascript
Vue实现调节窗口大小时触发事件动态调节更新组件尺寸的方法
2018/09/15 Javascript
[48:46]完美世界DOTA2联赛PWL S2 SZ vs FTD.C 第二场 11.19
2020/11/19 DOTA
python常见的格式化输出小结
2016/12/15 Python
深入浅析Python中的迭代器
2019/06/04 Python
Python 类属性与实例属性,类对象与实例对象用法分析
2019/09/20 Python
在Python中使用MongoEngine操作数据库教程实例
2019/12/03 Python
Python脚本去除文件的只读性操作
2020/03/05 Python
python3中for循环踩过的坑记录
2020/12/14 Python
英国最大的婴儿监视器网上商店:Baby Monitors Direct
2018/04/24 全球购物
Laura Geller官网:美国彩妆品牌
2018/12/29 全球购物
大专生自我鉴定范文
2013/10/01 职场文书
质检的岗位职责
2013/11/17 职场文书
诉讼代理人授权委托书
2014/04/08 职场文书
倡议书范文
2014/04/16 职场文书
软件研发工程师岗位职责
2014/09/30 职场文书
检讨书怎么写
2015/01/23 职场文书
2015年大学迎新工作总结
2015/07/16 职场文书
Python3 使用pip安装git并获取Yahoo金融数据的操作
2021/04/08 Python
详解SpringBoot异常处理流程及原理
2021/06/21 Java/Android