一、前言

博主最近在用elasticsearch做项目,查出来的数据都是数组,在筛选数据组装数据的时候,难免会碰到循环嵌套的问题。如果两个50000的数组循环嵌套,那实际运算则是50000*50000的运算量,十分影响程序执行速度。这篇文主要记录博主优化程序的过程。

二、测试程序性能工具

先提供一些测试工具,可以明确知道咱们哪部分程序消耗时间久,占用内存大。

1、测试程序执行时间的函数:

/** php输入毫秒部分的代码* */function msectime() {list($msec, $sec) = explode(' ', microtime());$msectime =  (float)sprintf('%.0f', (floatval($msec) + floatval($sec)) * 1000);return $msectime;}

借用这段程序检测函数执行速度,输出的是毫秒。关于这个函数,参考我之前的文章:
php获取当前时间的毫秒数,并且利用它测试代码段执行时间

2、php占用内存

echo "当前占用内存: ".memory_get_usage()." 字节 \n";
echo "内存峰值: ".memory_get_peak_usage()." 字节 \n";

这里通过获取当前内存占用的差值来判断程序执行消耗的内存。通过内存的峰值来查看哪部分消耗的内存最多,防止出现内存泄露情况。

三、开始优化

1、部分函数优化

博主在测试的时候,有个函数updateFunnel耗费了4s的时间,这个函数只是个单循环,但是为什么占用这么多内存了,后来百度发现,都是in_array在作怪:

使用 isset()代替 in_array()原来:    in_array($key,$a)改为:     $b = array_flip($a);isset($b[$key]);

优化后,此时updateFunnel耗时为 2.4s

2、数组嵌套循环优化

原函数:

foreach($this->arrEsIndex as $key=>&$val){foreach($this->arrEsIndex as $k=>$v) {if ($val['pixel.uuid'] == $v['pixel.uuid']) {if ($v['pixel.type'] == $this->login_step_val) {$val[$this->login_step] = 1;$val['pixel.user_id'] = $v['pixel.user_id'];}}               }}unset($val);unset($v);耗时:7.03-0.7 = 6.33s

优化后:

$newArr = array();foreach($this->arrEsIndex as $key=>$val){$newArr[$val['pixel.uuid']] = $val;}foreach($this->arrEsIndex as $k=>&$v){if(isset($newArr[$v['pixel.uuid']])){if($newArr[$v['pixel.uuid']]['pixel.type'] == $this->login_step_val){$v[$this->login_step] = 1;$v['pixel.user_id'] = $newArr[$v['pixel.uuid']]['pixel.user_id'];}}}unset($newArr);耗时: 0.751 - 0.748 = 0.03s

我们把两个数组的循环改为了一个数组的循环,同时使用isset()等内置函数来加快对比速度,最终优化效果还可以。不过这也说明了一个问题,咱们在写代码的时候,不能只注重功能的实现,一定要在写完之后测试一下速度。当然,最好是严格遵循一些默认的规则,比如此处的大数组循环,本来就是兵家大忌。

3、内存峰值的优化

我们php程序的内存都会有个限度,在php.ini中由memory_limit定义。一般来说本地的配置都是128M,在绝大部分情况下都是够用的,如果你的程序出现了内存泄露,那代表程序需要优化了,骚年。有些博客会给出方案,增大memory_limit的设置,只可惜治标不治本,推荐先优化程序。

博主在测试程序的时候,发现内存峰值在135M左右,也就是超过了规定的内存,那么问题究竟在哪里呢。经过一步步的打印内存峰值,最终锁定在一个数组变量上,释放掉这个数组变量之后,内存一下子就掉下去了,峰值维持在80M。这部分没法贴代码,大家如果遇到类似的情况,仔细测试下程序即可。

关于php的内存优化,可以参考我的另一篇文章,也许会有帮助哦:
php程序内存优化之数组操作优化

与君共勉!end!

php大数组循环嵌套的性能优化相关推荐

  1. php嵌套循环太慢,php 大数组 foreach 循环嵌套的性能优化

    前提:最近在做后台的时候,页面加载太慢,故第一时间想到的自然是优化SQL, 优化后sql查询速度从 2秒变成了零点几秒, 以为就这麽完事了,然并卵,加载竟然花费30秒! 这麽慢,然后在代码中分块记录它 ...

  2. h5如何上传文件二进制流_Hadoop如何将TB级大文件的上传性能优化上百倍?

    这篇文章,我们来看看,Hadoop的HDFS分布式文件系统的文件上传的性能优化. 首先,我们还是通过一张图来回顾一下文件上传的大概的原理. 由上图所示,文件上传的原理,其实说出来也简单. 比如有个TB ...

  3. 大主子表关联的性能优化方法

    [摘要] 主子表是数据库最常见的关联关系之一,最典型的包括合同和合同条款.订单和订单明细.保险保单和保单明细.银行账户和账户流水.电商用户和订单.电信账户和计费清单或流量详单.当主子表的数据量较大时, ...

  4. 大数据存储系统I/O性能优化技术研究进展

    大数据存储系统I/O性能优化技术研究进展 肖利民,霍志胜 北京航空航天大学计算机学院,北京 100191 摘要:大数据存储系统的I/O性能是影响大数据应用整体性能的关键因素之一,总结了当前在存储系统架 ...

  5. AntDB 落地某省电信大数据中心项目的性能优化案例分享

    亚信科技AntDB 落地某省电信大数据中心项目的性能优化案例分享 某省电信大数据中心项目采购了一套亚信科技AntDB 3.1分布式数据库,2018年8月初开始建设,建设周期一个月.9月份投入运行后,至 ...

  6. php 循环大数组 卡死,PHP 大数组循环问题_PHP教程

    小妹刚刚改投PHP门下.领导叫我把这段代码的执行效率优化一下 我现在知道的优化就是小循环外面,好像在这没啥用. 请问各位大侠我该怎么优化ne ? 领导说放内存里什么的. 基本就是2个大数组不停的循环算 ...

  7. JavaScript 大揭秘:React、性能优化以及多线程

    @开发者,在后端仅提供原始数据集的情况下,如何让所有搜索逻辑都在前端完成?不仅如此,还要能够实现预测用户输入.忽略错别字输入.快速自动补齐等智能功能?本文的作者就深入 JavaScript 技术特性, ...

  8. android app性能优化大汇总(UI渲染性能优化)

    UI性能测试 性能优化都需要有一个目标,UI的性能优化也是一样.你可能会觉得"我的app加载很快"很重要,但我们还需要了解终端用户的期望,是否可以去量化这些期望呢?我们可以从人机交 ...

  9. 【C语言简单说】十九:二维数组循环嵌套(2)

    这节直接用循环嵌套来输出二维数组了: 注:我说的队和列并不是一般说法,我用此比喻好让新手更好理解. #include<stdio.h> #include<stdlib.h> i ...

最新文章

  1. 学习MongoDB (1) :配置安装
  2. 虚拟机ubuntu使用笔记之samba安装
  3. Python连接MySQL数据库执行sql语句时的参数问题
  4. Windows mosek
  5. php 下载的压缩文件,php在线压缩打包rar并自动下载文件的例子
  6. 零基础学python
  7. easy html css tree 简单的HTML css导航树
  8. Python安装与第三方工具——pycharm安装
  9. PX4代码学习系列博客(1)——开发环境配置
  10. Intel-80386微处理器(IA-32架构)
  11. 概率论的V=max{X,Y},U=min{X,Y},W=X+Y的求解分布律解法——笔记
  12. 十年经验教你如何学习嵌入式
  13. FFmpeg将MP4视频切割成ts文件
  14. 重拾呐些記憶,前面の路,獨自繼續前往。
  15. Pangu Separates Heaven and Earth(签到题)
  16. 同济大学C++mooc第12讲:文件
  17. element ui 表格头部内容不换行
  18. Help Hanzo(区间素数筛)
  19. Spherical Harmonics Lighting in DirectX
  20. 转:各类职位的简写及中英对照

热门文章

  1. Linux入门和运维
  2. win10 编译姿态估计AlphaPose
  3. python 操作ipynb文件笔记
  4. 三维重建 KinectFusion
  5. retinaface tensorRT
  6. pybind11向C++ dll 传递数组 图像
  7. 超参数momentum与weight-decay的作用
  8. 卷积神经网络的“封神之路
  9. mina、netty消息边界问题
  10. 判断是否Ajax请求